numpy - 向量化函数:apply_over_axes / apply_along_axis
numpy - vectorize functions: apply_over_axes / apply_along_axis
我想计算 mm 个子数组的 mm*n 维数组的行列式,并希望以 fast/more 优雅的方式进行计算。蛮力方法有效:
import numpy as n
array=n.array([[[0.,1.,2.,3.],[2,1,1,0]],[[0.5, 0.5,2,2],[0.5,1,0,2]]])
detarray=n.zeros(4)
for i in range(4):
detarray[i]= n.linalg.det(array[:,:,i])
我会尝试用 apply_along_axis 来做这件事,但我知道这只适用于函数的一维参数,所以我想我无法让它工作。
不过,我认为 apply_over_axes 也应该有效:
n.apply_over_axes(n.linalg.det, array, [0,1])
但这给了我一个错误:
"det() takes exactly 1 argument (2 given)"
有谁知道为什么这不起作用?如果 apply_over_axes 确实无法进行此类计算,是否有比 for 循环更好的方法?
numpy.linalg.det
是开箱即用的矢量化。您需要做的就是将外轴向左移动:
>>> np.linalg.det(np.moveaxis(array, 2, 0))
array([-1. , 0.5, -2. , 6. ])
利用 transpose semantics of NumPy for 3D arrays, you can simply pass the transposed array to numpy.linalg.det()
如:
In [13]: arr = np.array([[[0.,1.,2.,3.],
[2, 1, 1, 0]],
[[0.5, 0.5,2,2],
[0.5, 1, 0, 2]]])
In [14]: np.linalg.det(arr.T)
Out[14]: array([-1. , 0.5, -2. , 6. ])
在性能方面,这种方法似乎 是另一种使用 numpy.moveaxis
手动移动轴的方法的两倍
In [29]: %timeit np.linalg.det(np.moveaxis(arr, 2, 0))
12.9 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [30]: %timeit np.linalg.det(arr.T)
6.2 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
我想计算 mm 个子数组的 mm*n 维数组的行列式,并希望以 fast/more 优雅的方式进行计算。蛮力方法有效:
import numpy as n
array=n.array([[[0.,1.,2.,3.],[2,1,1,0]],[[0.5, 0.5,2,2],[0.5,1,0,2]]])
detarray=n.zeros(4)
for i in range(4):
detarray[i]= n.linalg.det(array[:,:,i])
我会尝试用 apply_along_axis 来做这件事,但我知道这只适用于函数的一维参数,所以我想我无法让它工作。
不过,我认为 apply_over_axes 也应该有效:
n.apply_over_axes(n.linalg.det, array, [0,1])
但这给了我一个错误: "det() takes exactly 1 argument (2 given)"
有谁知道为什么这不起作用?如果 apply_over_axes 确实无法进行此类计算,是否有比 for 循环更好的方法?
numpy.linalg.det
是开箱即用的矢量化。您需要做的就是将外轴向左移动:
>>> np.linalg.det(np.moveaxis(array, 2, 0))
array([-1. , 0.5, -2. , 6. ])
利用 transpose semantics of NumPy for 3D arrays, you can simply pass the transposed array to numpy.linalg.det()
如:
In [13]: arr = np.array([[[0.,1.,2.,3.],
[2, 1, 1, 0]],
[[0.5, 0.5,2,2],
[0.5, 1, 0, 2]]])
In [14]: np.linalg.det(arr.T)
Out[14]: array([-1. , 0.5, -2. , 6. ])
在性能方面,这种方法似乎 是另一种使用 numpy.moveaxis
In [29]: %timeit np.linalg.det(np.moveaxis(arr, 2, 0))
12.9 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [30]: %timeit np.linalg.det(arr.T)
6.2 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)