Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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(熊猫)广播的基本知识,但却被这个简单的例子困住了: x = np.arange(5) y = np.random.uniform(size = (2,5)) z = x*y print(z.shape) #(2,5) 我对z形的理解是,你有一个(1,5)数组乘以(2,5)数组,5的尾随维数相等,因此你得到了一个2x5数组。好的,听起来不错。我的问题是为什么是x.shape=(5,)?它不是一维的吗,所以它真的是1x5 NumPy1D数组,如x无需重塑即可提供(5,)等

我了解numpy(熊猫)广播的基本知识,但却被这个简单的例子困住了:

x = np.arange(5) 
y = np.random.uniform(size = (2,5)) 
z = x*y 
print(z.shape) #(2,5) 

我对z形的理解是,你有一个
(1,5)
数组乘以
(2,5)
数组,5的尾随维数相等,因此你得到了一个
2x5
数组。好的,听起来不错。我的问题是为什么是
x.shape=(5,)
?它不是一维的吗,所以它真的是1x5

NumPy
1D数组,如
x
无需重塑即可提供
(5,)
等形状。如果要将其视为1列矩阵的形状
1x5
,则执行
np.arange(5)。重塑(1,5)

广播规则如下:

Add leading singleton dimensions as needed to match number of dimensions
Scale any singleton dimensions to match dimension values
Raise error dimensions can't be matched
使用您的
x
y

(5,) * (2,5)
(1,5) * (2,5)          # add the leading 1
(2,5) * (2,5)          # scale the 1
=> (2,5)

如果
y
为(5,2),则会引发错误,因为
(1,5)
不能与
(5,2)
配对。但是
(5,1)
是可以的,因为
(1,5)*(5,1)=>(5,5)

为什么一维数组的格式是(#,)?我想这就是让我讨厌的原因。我习惯于通过比较AxBx格式来查看它,那么它会像这样吗(3,)=3(1,3)=1 x 3(2,3,3)=2 x 3 x 3通常我们将二维阵列形状称为(行、列)。所以
(1,5)
将是一个单行5列,(5,1)是5行1列或一个单列数组。出于广播目的,(5,)被视为与(1,5)相同。在
numpy
中,一维数组实际上只有一个维度,形状是一个单元素元组,例如
(5,)
。当广播
numpy
时,会根据需要添加前导维度,因此会根据需要扩展到(1,5)、(1,1,5)等。不要忘记,在python中,单个元素列表写为
[n]
,单个元素元组写为
(n,)
。数组的形状是元组。