Python 在numpy中计算广播形状
我了解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,)等
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,)
。数组的形状是元组。