内置的ufunc方法的目的主要是免去了编写循环的代码。使用的形式为 "np.operation_name.ufunc"
import numpy as np
np.multiply.reduce([2, 3, 5]) # 返回结果30
X = np.arange(8).reshape(2, 2, 2)
# X的形式为
[[[0, 1],
[2, 3]],
[[4, 5],
[6, 7]]]
np.add.reduce(X, 0)
# 返回结果
[[4, 6],
[8, 10]]
np.add.reduce(X) # 默认 axis=0,结果与上方代码相同
np.add.reduce(X, 1)
# 返回结果
[[2, 4],
[10, 12]]
np.add.reduce(X, 2)
# 返回结果
[[1, 5],
[9, 13]]
两个一维数组最终生成一个二维数组,(5,)和(5,)生成(5, 5)的数组。
arr = np.arange(3).repeat([1, 2, 2]) # 得到 [0, 1, 1, 2, 2]
np.multiply.outer(arr, np.arange(5))
# 得到
[[0, 0, 0, 0, 0],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 2, 4, 6, 8],
[0, 2, 4, 6, 8]]
np.add.accumulate([2, 3, 5]) # 返回 [2, 5, 10]
np.multiply.accumulate([2, 3, 5]) # 返回 [2, 6, 30]
对于二维数组而言,首先创建一个对角矩阵,
I = np.eye(2)
# [[1, 0],
# [0, 1]]
np.add.accumulate(I, 0)
# [[1, 0],
# [1, 1]]
np.add.accumulate(I, 1)
# [[1, 1],
# [0, 1]]
accumulate方法和reduce方法的差异就像是cumsum和sum的区别,accumulate方法会产生与原数组相同的记录累积分布的数组。
相当于pandas的groupby方法,都是用于聚合,但是不如pandas的groupby方法灵活,
numpy中有两个工具可以将自定义方法像ufunc那样使用。这两个方法在运行时候会比其他numpy方法慢很多,因为其他方法基于C语言,而这两个方法调用传入的方法时使用的是Python的解释器。
该方法接受一个Python函数和两个分别表示输入输出参数数量的整数,