python - Numpy ndarray 乘法

标签 python arrays numpy

我有两个 3D numpy ndarray

A=np.array([[[1, 1],
             [1, 1],
             [1, 1]],

            [[2, 2],
             [2, 2],
             [2, 2]]])

B=np.array([[[ 2,  0],
             [ 0,  2]],

            [[ 2, -2],
             [-2,  2]]])

我想用元素创建 AB 数组 ABijk=∑m (Aijm*Bimk) 其中总和仅超过 m-index(重复)而不超过 i(依次重复)。

换句话说,我可以用这个 for 循环获得 di AB ndarray

for i in range(2):
    AB[i,:,:]=np.dot(A[i,:,:],B[i,:,:])

AB 等于

array([[[ 2.,  2.],
    [ 2.,  2.],
    [ 2.,  2.]],

   [[ 0.,  0.],
    [ 0.,  0.],
    [ 0.,  0.]]])

有没有办法避免 for 循环?如何用 tensordot 或 einsum 获取 AB 数组?

谢谢你的回答,我真的很感激。

最佳答案

在足够新的 NumPy (1.10+) 上,你可以做

AB = np.matmul(A, B)

或者(如果您还有 Python 3.5+):

AB = A @ B

如果你没有 NumPy 1.10+,你也可以

AB = np.einsum('ijm,imk->ijk', A, B)

对于较大的 J/M/K 维度,尤其是如果您有良好的 BLAS,可能还值得考虑使用 dot 的显式 for 循环。 BLAS 矩阵乘法可能比更多解释 Python 损失的开销节省更多时间。我认为 np.matmul@ 应该利用 dot 做的相同事情,但我不认为 np .einsum 是。

关于python - Numpy ndarray 乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41986218/

相关文章:

python 相当于 MATLAB 语句 A(B==1)= C

python - NLOPT 无效参数 Python

python - re.sub 只替换两次

Java - 使用存储在数组中的文本更改 JLabel

c - 在 C 中不使用指针对结构体数组进行排序

java - 如何按价格和名称对商品进行排序?

python - "Easing"Matplotlib 中的转换

python - 在没有 setcap cap_net_raw 的 Linux 中打开原始套接字

python - 我应该如何从 Python 类中公开只读字段?

python - 如何按列导出数据框以分隔 csv 文件?以及如何将不同数据框中的列附加到分离的 csv 文件中