什么是一个有效的方式来改变符号的矩阵列在矩阵乘法与numpy

fbcarpbf  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(134)

我有两个Nx3矩阵fr,我想得到这个量

(f*r).sum()

例如,有时我需要在计算之前更改r的某些列的符号

n=5
f=np.random.rand(n,3)
r=np.random.rand(n,3)

# real calculation
r[:, [0,2]]= -r[:, [0,2]]
got=(f*r).sum()

有没有什么小窍门能让这更快?
编辑:
也许是这个

got = (f * rr).sum(axis=0)
print(-got[0].sum() + got[1].sum() - got[2].sum())
kr98yfug

kr98yfug1#

您可以使用einsum函数,该函数允许您使用单个函数调用执行数组的逐元素乘法和求和。

import numpy as np

n = 5
f = np.random.rand(n, 3)
r = np.random.rand(n, 3)

# Multiply f and r, changing the sign of columns 0 and 2 of r
result = np.einsum('ij,ij->i', f, np.array([-1, 1, -1]) * r)

print(result)

这应该会给予与原始计算相同的结果,但对于大型数组可能会更快。注意,np.array([-1, 1, -1])项改变r的第0列和第2列的符号。
我建议阅读this answer以获得更多关于einsum如何工作的细节。

9udxz4iz

9udxz4iz2#

您可以使用 multiplier list/array,其中r数组的每一列都有相应的乘数:

(f * (r * [-1,1,-1])).sum()

相关问题