numpy 快速运算

numpy 提供了一些快速运算方法,使得用户可以避免手动循环迭代降低效率,同时使代码更加 Pythonic

清单

  • numpy广播运算
    • 四则运算
    • 布尔运算
  • np.frompyfunc 函数

注:代码中统一用 np 默认代替 numpy

细则

广播运算

pass

np.frompyfunc 函数

参考 np.sqrtnp.sin 这样的函数,那么 numpy 应该支持对对每一个 ndarray 类型进行一定操作,因此出现了 np.frompyfunc。 在这个函数中可以通过自定义函数使得 func 可以对每一个元素进行操作。

这个函数更多使用的是高维情况,无法很难使用列表推导式等方法,自己造轮子效率低且往往性能不佳

使用示例,高维数据下的元素替换

>>> import numpy as np
>>> a = np.arange(9).reshape((3, 3))
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> dic = dict(zip(range(0, 9, 3), ['a', 'b', 'c']))
>>> dic
{0: 'a', 3: 'b', 6: 'c'}
>>> array_replace = np.frompyfunc(lambda x: dic.get(x) if dic.get(x) else x, 1, 1)
>>> array_replace(a)
array([['a', 1, 2],
       ['b', 4, 5],
       ['c', 7, 8]], dtype=object)
>>>

np.apply_along_axis

自上次遇到需要矩阵每一个元素后,这次又遇到了新的问题。

如何快速处理每一行,即对矩阵每一行进行操作

因此在使用列表推导式之前找到了这个 np.apply_along_axis 沿某一纬度进行操作。

>>> import numpy as np
>>> a = np.arange(9).reshape((3, 3))
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> def func(line):
        return line[0] * line[-1] > line[0]

>>> res = np.apply_along_axis(func, 1, a)
>>> res
array([False,  True,  True])