第25单元 揭秘通用函数
矢量化通用函数是对应广播功能的函数。只需要一次函数调用,就可以将通用函数应用于所有数组项。numpy提供了很多通用函数,举例如下。
算术运算:add()、multiply()、negative()、exp()、log()、sqrt()
三角函数:sin()、cos()、hypot()
按位运算:bitwise_and()、left_shift()
关系和逻辑运算:less()、logical_not()、equal()
maximum()和minimum()
使用浮点数的函数:isinf()、isfinite()、floor()、isnan()
假设一个名为stocks的一维数组中记录了sap中8个代码对应的股票在2016年1月10日的周末前后的价格。
Stocks ➾ array([ 140.49, 0.97, 40.68, 41.53, 55.7 , 57.21, 98.2 , ➾ 99.19, 109.96, 111.47, 35.71, 36.27, 87.85, 89.11, ➾ 30.22, 30.91])
现在我们想知道哪些股票的价格在周末下跌了。首先,按照股票代码对股价进行分组,并将较新的报价放在较早的报价之后。其实现方法是把原始数组重排成2×8的矩阵:
stocks = stocks.reshape(8, 2).T ➾ array([[ 140.49, 40.68, 55.7 , 98.2 , 109.96, 35.71, 87.85, ➾ 30.22], ➾ [ 0.97, 41.53, 57.21, 99.19, 111.47, 36.27, 89.11, ➾ 30.91]])
接下来使用greater()函数逐列比较数组的两行数据,根据所得到的布尔索引就能找出感兴趣的股票代码:
fall = np.greater(stocks[0], stocks[1]) ➾ array([True, False, False, False, False, False, False, False], dtype=bool) sap[fall] ➾ array(['MMM'], ➾ dtype='<U4')
顺便介绍一下,MMM是一家使用“庞氏骗局”的俄罗斯公司,它从未在任何证券交易所上市。难怪它的股价正在下跌。
除了“传统”数字之外,numpy全面支持IEEE 754浮点标准,并提供正无穷大(inf)和非数字(nan)两种符号。如果没有使用numpy,则这两个符号分别是float("inf")和float("nan")。按照数据科学领域约定的做法,本书使用nan作为缺失数据的占位符(缺失数据的问题在第1单元中介绍过)。
通用函数isnan()是一个极好用的nan的定位工具。实际上,对于下面的例子,用零值替换缺失的数据恐怕是一个很糟糕的做法(我们之前在第23单元就是这么做的),所以下面我们用isnan()重做一次:
# 假定MMM股票的新报价丢失了 stocks[1, 0] = np.nan np.isnan(stocks) ➾ array([[False, False, False, False, False, False, False, False], ➾ [ True, False, False, False, False, False, False, False]], dtype=bool) # 修复;没有比这更糟的做法了 stocks[np.isnan(stocks)] = 0 ➾ array([[ 140.49, 40.68, 55.7 , 98.2 , 109.96, 35.71, 87.85, ➾ 30.22], ➾ [ 0. , 41.53, 57.21, 99.19, 111.47, 36.27, 89.11, ➾ 30.91]])
通用函数扩展了Python的算术函数和关系运算符的功能,增加了更多的可能性,这种方式给出的条件函数可以说是Python逻辑运算符的加强版。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论