首页 > 解决方案 > numpy 分别广播到矩阵的每一列

问题描述

我必须矩阵:

a = np.array([[6],[3],[4]])
b = np.array([1,10])

当我做:

c = a * b

c 看起来像这样:

[ 6, 60]
[ 3, 30]
[ 4, 40]

这很好。现在,假设我向 a 添加了一个列(为了示例,它是一个相同的列。但它必须是):

a = np.array([[6,6],[3,3],[4,4]])

b 保持不变。

我想要的结果是 2 个相同的 c 副本(因为列是相同的),沿新轴堆叠:

new_c.shape == [3,2,2]

什么时候如果你这样做,new_c[:,:,0]或者new_c[:,:,1]你得到原来的c。我尝试使用向 a 和 b 添加新轴,np.expand_dims但没有帮助。

标签: pythonnumpyarray-broadcasting

解决方案


一种方法是使用numpy.einsum

>>> import numpy as np
>>> a = np.array([[6],[3],[4]])
>>> b = np.array([1,10])
>>> print(a * b)
[[ 6 60]
 [ 3 30]
 [ 4 40]]
>>> print(np.einsum('ij, j -> ij', a, b))
[[ 6 60]
 [ 3 30]
 [ 4 40]]
>>> a = np.array([[6,6],[3,3],[4,4]])
>>> print(np.einsum('ij, k -> ikj', a, b)[:, :, 0])
>>> print(np.einsum('ij, k -> ikj', a, b)[:, :, 1])
[[ 6 60]
 [ 3 30]
 [ 4 40]]
[[ 6 60]
 [ 3 30]
 [ 4 40]]

有关 的更多用法numpy.einsum,我建议:

了解 NumPy 的 einsum


推荐阅读