Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一维numpy数组的行为是否总是像行向量?_Python_Numpy_Array Broadcasting - Fatal编程技术网

Python 一维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

我试图对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数组的右对齐属性。当您有一个形状
(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)是另一个形状。