numpy 有没有一个函数可以改变所有数组的形状,这样广播中的所有数组都在不同的维度上

u5i3ibmn  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(63)

假设你有3个形状为(3,)的数组,你想找到它们在不同维度上的乘积,结果是一个形状为(3,3,3)的数组。我知道你可以重塑它们,然后使用广播规则来找到产品。

a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])

a.reshape(1,1,-1)*b.reshape(1,-1,1)*c.reshape(-1,1,1)

字符串
是否有一个函数或方法来重塑数组以达到相同的结果?
我的解决方案:

d = [a,b,c,a,b,c] # arrays = 6
l = len(d) # n arrays


然后我创建一个n*n数组,所有的都是1,但对角线是负的,以设置形状(-1,1,1,1,1,1),(1,-1,1,1,1,1)等。

sh = (np.ones((l,l))-np.eye(l)*2).astype(int)


用形状压缩目标数组,然后索引结果列表以查找产品。在这种情况下,输出具有形状(3,3,3,3,3,3)。

z = [j.reshape(i) for i,j in zip(sh,d)]
z[0]*z[1]*z[2]*z[3]*z[4]*z[5]


我相信有一个更好的方法-有人能帮忙吗?

xkrw2x1b

xkrw2x1b1#

请注意,你计算的是

np.einsum('i,j,k',a,b,c)

字符串
np.einsum('a,b,c',a,b,c)。那是一样的。更常见的是以i开头,我不想造成混乱,也不想让人相信下标字符串与变量名有关
如果这还不够自动化,您可以

def myProd(*v):
    return np.einsum(','.join("abcdefghijklmnopqrstuvwxyz"[:len(v)]), *v)


然后呢

myProd(a,b,c)

相关问题