Python 一维numpy数组的行为是否总是像行向量?
我试图对numpy中的广播规则有一个很好的理解,但我注意到我首先需要对什么是一维numpy阵列有一个很好的理解。我发现多个来源说一维numpy数组既不是水平向量也不是垂直向量。从这一点上,我希望它的行为会有所不同,这取决于所完成的操作和操作的其他组件。但我真的找不到一维数组的行为像列向量的情况。例如:Python 一维numpy数组的行为是否总是像行向量?,python,numpy,array-broadcasting,Python,Numpy,Array Broadcasting,我试图对numpy中的广播规则有一个很好的理解,但我注意到我首先需要对什么是一维numpy阵列有一个很好的理解。我发现多个来源说一维numpy数组既不是水平向量也不是垂直向量。从这一点上,我希望它的行为会有所不同,这取决于所完成的操作和操作的其他组件。但我真的找不到一维数组的行为像列向量的情况。例如: a = np.arange(3) b = np.arange(3)[:, np.newaxis] a + b array([[0, 1, 2], [1, 2, 3], [2
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数组的右对齐属性。当您有一个形状(n,)
的向量和一些其他形状(a,b,c,d,…,z)
数组时,numpy将始终尝试将向量广播到形状(1,1,…,n)
,最后检查n
是否可以使用z
进行广播(换句话说,z
是n
的倍数)
现在,如果您不希望出现这种行为,您必须明确地告诉numpy,您希望如何通过使用np.newaxis
将axis添加到向量中,从而与正在使用的另一个数组进行广播。您还可以使用函数np.broadcast\u arrays
获取广播的数组
比如说,
将numpy导入为np
a=np.array([1,2,3])
b=np.眼(3)
#首先将a广播到形状(1,3)
#将向量a添加到b的行中
# [[1, 0, 0] [[1, 2, 3]
# [0, 1, 0] + [1, 2, 3]
# [0, 0, 1]] [1, 2, 3]]
打印(a+b)
#明确地告诉numpy你想要什么
#要广播的向量
#现在,a首先广播到shape(3,1)
#向量a被添加到b的列中
# [[1, 0, 0] [[1, 1, 1]
# [0, 1, 0] + [2, 2, 2]
# [0, 0, 1]] [3, 3, 3]]
打印(b+a[np.newaxis,:])
您刚才遇到的是numpy数组的右对齐属性。当您有一个形状(n,)
的向量和一些其他形状(a,b,c,d,…,z)
数组时,numpy将始终尝试将向量广播到形状(1,1,…,n)
,最后检查n
是否可以使用z
进行广播(换句话说,z
是n
的倍数)
现在,如果您不希望出现这种行为,您必须明确地告诉numpy,您希望如何通过使用np.newaxis
将axis添加到向量中,从而与正在使用的另一个数组进行广播。您还可以使用函数np.broadcast\u arrays
获取广播的数组
比如说,
将numpy导入为np
a=np.array([1,2,3])
b=np.眼(3)
#首先将a广播到形状(1,3)
#将向量a添加到b的行中
# [[1, 0, 0] [[1, 2, 3]
# [0, 1, 0] + [1, 2, 3]
# [0, 0, 1]] [1, 2, 3]]
打印(a+b)
#明确地告诉numpy你想要什么
#要广播的向量
#现在,a首先广播到shape(3,1)
#向量a被添加到b的列中
# [[1, 0, 0] [[1, 1, 1]
# [0, 1, 0] + [2, 2, 2]
# [0, 0, 1]] [3, 3, 3]]
打印(b+a[np.newaxis,:])
你真的在问广播规则,它适用于所有阵列,而不仅仅是1d。1d不是特例。在numpy
中,“行向量”没有特殊含义。(1,3)数组只是一个二维数组;(3,1)是另一个形状。你真的在问广播规则,它适用于所有阵列,而不仅仅是1d。1d不是特例。在numpy
中,“行向量”没有特殊含义。(1,3)数组只是一个二维数组;(3,1)是另一个形状。