gpt4 book ai didi

python - numpy - 向量化函数 : apply_over_axes/apply_along_axis

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:27 25 4
gpt4 key购买 nike

我想计算一个 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_along_axis 来执行此操作,但我知道这仅适用于函数的一维参数,因此我认为我无法使其正常工作。

但是,我认为 apply_over_axes 也应该有效:

n.apply_over_axes(n.linalg.det, array, [0,1])

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

有谁知道为什么这不起作用?如果使用 apply_over_axes 确实无法进行此类计算,是否有比 for 循环更好的方法?

最佳答案

利用transpose semantics of NumPy对于 3D 数组,您可以简单地将转置数组传递给 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)

关于python - numpy - 向量化函数 : apply_over_axes/apply_along_axis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52728493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com