numpy向量化函数:apply_over_axies/apply_along_axis

2024-04-19 16:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算mm*n维数组的mm子数组的行列式,并且想用一种更快/更优雅的方式来计算。暴力方法有效:

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_沿着_轴来做这个,但是我知道这只适用于函数的一维参数,所以我想我不能让它工作。在

但是,我认为在轴上应用_轴也可以:

^{pr2}$

但这给了我一个错误: “det()只接受1个参数(给定2个)”

有人知道为什么这样不行吗?如果这种类型的计算真的不可能用apply_over_轴,有没有比for循环更好的方法?在


Tags: 方法importnumpyfor参数as方式数组
2条回答

利用3D数组的transpose semantics of NumPy,您可以简单地将转置数组传递给^{},如下所示:

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手动移动轴的方法的两倍

^{pr2}$

numpy.linalg.det是开箱即用的矢量化。您只需将外部轴向左移动:

>>> np.linalg.det(np.moveaxis(array, 2, 0))
array([-1. ,  0.5, -2. ,  6. ])

相关问题 更多 >