None
或np.newaxis
是增加一個維度的陣列的常見方式。 reshape
與(3,3,1)的作品一樣好:
In [64]: arr=np.arange(9).reshape(3,3)
In [65]: arr1 = arr[...,None]
In [66]: arr1.shape
Out[66]: (3, 3, 1)
repeat
爲函數或方法複製本。
In [72]: arr2=arr1.repeat(3,axis=2)
In [73]: arr2.shape
Out[73]: (3, 3, 3)
In [74]: arr2[0,0,:]
Out[74]: array([0, 0, 0])
但你可能不需要這樣做。廣播(3,3,1)與(3,3,3)一起工作。
In [75]: (arr1+arr2).shape
Out[75]: (3, 3, 3)
事實上,它會播放一個(3,)產生(3,3,3)。
In [77]: arr1+np.ones(3,int)
Out[77]:
array([[[1, 1, 1],
[2, 2, 2],
...
[[7, 7, 7],
[8, 8, 8],
[9, 9, 9]]])
因此arr1+np.zeros(3,int)
是將(3,3,1)擴展到(3,3,3)的另一種方式。
廣播規則是:
(3,3,1) + (3,) => (3,3,1) + (1,1,3) => (3,3,3)
廣播需要在開始增加尺寸。
當您在軸上綜上所述,你可以保持尺寸的原號碼與參數:
:
In [78]: arr2.sum(axis=2).shape
Out[78]: (3, 3)
In [79]: arr2.sum(axis=2, keepdims=True).shape
Out[79]: (3, 3, 1)
,如果你想從沿任意維度的數組中減去平均這是很方便
arr2-arr2.mean(axis=2, keepdims=True)