我试图对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数组是否总是模仿水平矢量的行为?如果不是,那么在什么情况下它们表现得像标准垂直矢量?
您刚刚遇到的被称为numpy向量的right align属性。当您有一个形状为(n, )
的矢量和某个形状为(a, b, c, d, ..., z)
的其他数组时,numpy将始终尝试广播该矢量以使其形状为(1, 1, ...., n)
,并最终检查n
是否可通过z
进行广播(换句话说, ,z
是n
的倍数)。
现在,如果您不想要该行为,则必须明确地告诉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, :])