一维numpy数组是否总是像行向量一样?

问题描述 投票:0回答:1

我试图对numpy中的广播规则有一个很好的了解,但是我注意到我首先需要对什么是一维numpy数组有一个很好的了解。我发现有多个消息来源说一维numpy数组既不是水平矢量也不是垂直矢量。因此,我希望它的行为根据完成的操作和操作的其他组件而有所不同。但是我真的找不到一维数组会像列向量一样的情况。例如:

a = np.arange(3)
b = np.arange(3)[:, np.newaxis]
a + b
array([[0, 1, 2],
      [1, 2, 3],
      [2, 3, 4]])

表示a的行为类似于水平向量。另一方面,如果将其添加到水平向量b

a = np.arange(3)
b = np.arange(3)[np.newaxis, :]
a + b
array([[0, 1, 4]])

a仍然表现得像水平向量。另一方面,a似乎与.T的转换无关。所以我的问题是-一维Numpy数组是否总是模仿水平矢量的行为?如果不是,那么在什么情况下它们表现得像标准垂直矢量?

python numpy numpy-broadcasting
1个回答
0
投票

您刚刚遇到的被称为numpy向量的right align属性。当您有一个形状为(n, )的矢量和某个形状为(a, b, c, d, ..., z)的其他数组时,numpy将始终尝试广播该矢量以使其形状为(1, 1, ...., n),并最终检查n是否可通过z进行广播(换句话说, ,zn的倍数)。

现在,如果您不想要该行为,则必须明确地告诉numpy,如何通过使用np.newaxis向矢量添加轴来与要操作的其他数组一起广播。您也可以使用函数np.broadcast_arrays获取广播的数组。

例如,

import numpy as np

a = np.array([1, 2, 3])

b = np.eye(3)

# broadcasts a to shape (1, 3) first
# adds the vector a to rows of b
# [[1, 0, 0]      [[1, 2, 3]
#  [0, 1, 0]   +   [1, 2, 3]
#  [0, 0, 1]]      [1, 2, 3]]
print(a + b)

# Tell numpy explicitly, how you want
# your vector to be broadcasted
# Now, a is first broadcasted to shape (3, 1)
# and the vector a is added to the columns of b
# [[1, 0, 0]      [[1, 1, 1]
#  [0, 1, 0]   +   [2, 2, 2]
#  [0, 0, 1]]      [3, 3, 3]]
print(b + a[np.newaxis, :])
© www.soinside.com 2019 - 2024. All rights reserved.