Python numpy中Kronecker积的双循环矢量化和整形

Python numpy中Kronecker积的双循环矢量化和整形,python,numpy,matrix-multiplication,tensor,Python,Numpy,Matrix Multiplication,Tensor,我有两个矩阵 import numpy as np n = 10 a = 2*np.ones((n,n,3)) b = 3*np.ones((n,n,3)) 我想用Kronecker积的方法乘以它们,然后求和 s = 0 for i in range(n): for j in range(n): s += a*b[i,j] numpy中是否存在将其矢量化的方法?您的代码可以重写为: 因此,这应该是可行的: s = a * np.sum(np.sum(b,axis=

我有两个矩阵

import numpy as np
n = 10
a = 2*np.ones((n,n,3))
b = 3*np.ones((n,n,3))
我想用Kronecker积的方法乘以它们,然后求和

s = 0
for i in range(n):
    for j in range(n):
        s +=  a*b[i,j]

numpy中是否存在将其矢量化的方法?

您的代码可以重写为:

因此,这应该是可行的:

s = a * np.sum(np.sum(b,axis=1),axis=0)

您的代码可以重写为:

因此,这应该是可行的:

s = a * np.sum(np.sum(b,axis=1),axis=0)

也许这可以用以下文字更优雅地书写:

甚至只使用
np.sum()

但是
np.einsum()
似乎更快:

n = 100
a = 2 * np.ones((n, n, 3))
b = 3 * np.ones((n, n, 3))

%timeit f_with_loops(a, b)
# 1 loop, best of 3: 787 ms per loop
%timeit a * np.einsum('ijk->k', b)
# 10000 loops, best of 3: 121 µs per loop
%timeit a * np.sum(b, axis=(0, 1))
# 1000 loops, best of 3: 254 µs per loop

也许这可以用以下文字更优雅地书写:

甚至只使用
np.sum()

但是
np.einsum()
似乎更快:

n = 100
a = 2 * np.ones((n, n, 3))
b = 3 * np.ones((n, n, 3))

%timeit f_with_loops(a, b)
# 1 loop, best of 3: 787 ms per loop
%timeit a * np.einsum('ijk->k', b)
# 10000 loops, best of 3: 121 µs per loop
%timeit a * np.sum(b, axis=(0, 1))
# 1000 loops, best of 3: 254 µs per loop

你的代码正确吗
a*b[i,j]
应该返回与
a
形状相同的数组,而不是标量(正如
s=0
所建议的那样)。是的,它无论如何都能正常工作,
s
应该与
a
形状相同。但是你可以写
s=np.zero((n,n,3))
你的代码正确吗
a*b[i,j]
应该返回与
a
形状相同的数组,而不是标量(正如
s=0
所建议的那样)。是的,它无论如何都能正常工作,
s
应该与
a
形状相同。但是你也可以写
s=np.zero((n,n,3))
注意,这可以简单地写为
a*np.sum(b,axis=(0,1))
谢谢。我甚至不知道这个功能。请注意,它可以简单地写成
a*np.sum(b,axis=(0,1))
谢谢。我甚至不知道这个功能。