gpt4 book ai didi

python - 广播用于逐元素乘法的 3d 数组

转载 作者:行者123 更新时间:2023-11-28 20:32:36 26 4
gpt4 key购买 nike

晚上好

我需要一些帮助来理解复杂 numpy 数组的高级广播。

我有:

数组 A:50000x2000

数组 B:2000x10x10

for循环的实现:

for k in range(50000):
temp = A[k,:].reshape(2000,1,1)
finalarray[k,:,:]=np.sum ( B*temp , axis=0)

我想要一个具有 2000 个元素的轴的逐元素乘法和求和,以及最终产品:

最终数组:50000x10x10

是否可以避免 for 循环?谢谢!

最佳答案

对于这样的事情,我会使用 np.einsum ,这使得根据您想要的索引操作写下您想要发生的事情变得非常容易:

fast = np.einsum('ij,jkl->ikl', A, B)

这给了我相同的结果(下降 50000->500 所以循环很快完成):

A = np.random.random((500, 2000))
B = np.random.random((2000, 10, 10))
finalarray = np.zeros((500, 10, 10))
for k in range(500):
temp = A[k,:].reshape(2000,1,1)
finalarray[k,:,:]=np.sum ( B*temp , axis=0)

fast = np.einsum('ij,jkl->ikl', A, B)

给我

In [81]: (finalarray == fast).all()
Out[81]: True

即使在 50000 的情况下也有合理的表现:

In [88]: %time fast = np.einsum('ij,jkl->ikl', A, B)
Wall time: 4.93 s

In [89]: fast.shape

Out[89]: (50000, 10, 10)

或者,在这种情况下,您可以使用 tensordot:

faster = np.tensordot(A, B, axes=1)

这会快几倍(代价是不太通用):

In [29]: A = np.random.random((50000, 2000))

In [30]: B = np.random.random((2000, 10, 10))

In [31]: %time fast = np.einsum('ij,jkl->ikl', A, B)
Wall time: 5.08 s

In [32]: %time faster = np.tensordot(A, B, axes=1)
Wall time: 504 ms

In [33]: np.allclose(fast, faster)
Out[33]: True

我必须在此处使用 allclose,因为最终值会略有不同:

In [34]: abs(fast - faster).max()
Out[34]: 2.7853275241795927e-12

关于python - 广播用于逐元素乘法的 3d 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52210441/

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