numpy通过向量减去矩阵的每一行

the*_*man 44 python numpy matrix

所以我有一个n x d矩阵和一个n x 1向量.我正在尝试编写一个代码来通过向量减去矩阵中的每一行.

我目前有一个for迭代循环,并i通过向量减去矩阵中的第-行.有没有办法简单地通过向量减去整个矩阵?

谢谢!

当前代码:

for i in xrange( len( X1 ) ):
    X[i,:] = X1[i,:] - X2
Run Code Online (Sandbox Code Playgroud)

这是X1矩阵的i第 - 行并且X2是向量.我可以做到这样我不需要for循环吗?

Joh*_*024 58

这适用于numpy仅当尾随轴具有相同的尺寸时.以下是从矩阵中成功减去矢量的示例:

In [27]: print m; m.shape
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
Out[27]: (4, 3)

In [28]: print v; v.shape
[0 1 2]
Out[28]: (3,)

In [29]: m  - v
Out[29]: 
array([[0, 0, 0],
       [3, 3, 3],
       [6, 6, 6],
       [9, 9, 9]])
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为两者的后轴具有相同的尺寸(3).

在您的情况下,引导轴具有相同的尺寸.以下是使用与v上面相同的示例,说明如何修复:

In [35]: print m; m.shape
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
Out[35]: (3, 4)

In [36]: (m.transpose() - v).transpose()
Out[36]: 
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [6, 7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

这里详细解释了广播轴的规则.

  • @xuiqzy。非常好的一点。我会删除评论。转置通常会复制记忆。更好的方法可能是 `m - v[:, None]` (3认同)
  • @MadPhysicist问题是numpy中的一维数组无法转置,因为它将与输出相同。您必须向其添加一个维度才能转置它,就像 Nagasaki45 的答案中或使用 ndmin=2 参数创建 np.array 时一样。 (2认同)

Nag*_*i45 11

除了@ John1024答案之外,在numpy中"转置"一维向量可以这样做:

In [1]: v = np.arange(3)

In [2]: v
Out[2]: array([0, 1, 2])

In [3]: v = v[:, np.newaxis]

In [4]: v
Out[4]:
array([[0],
       [1],
       [2]])
Run Code Online (Sandbox Code Playgroud)

从这里开始,使用广播v从每一列中减去m是微不足道的:

In [5]: print(m)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

In [6]: m - v
Out[6]:
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [6, 7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,如果您忘记了 np.newaxis , mv[:, None] 也可以工作。我认为这个选项更简单。 (3认同)
  • @克里斯蒂安奥莱利。`np.newaxis 为 None`。它们指的是同一个对象。在这一点上,作者认为这是更清晰的。 (3认同)