這篇文章主要講解了“如何使用NumPy中的廣播”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何使用NumPy中的廣播”吧!
正常情況下,兩個數組需要進行運算,那么每個數組的對象都需要有一個相對應的值進行計算才可以。比如下面的例子:
a = np.array([1.0, 2.0, 3.0])b = np.array([2.0, 2.0, 2.0])a * b array([ 2., 4., 6.])
但是如果使用Numpy的廣播特性,那么就不必須元素的個數準確對應。
比如,我們可以講一個數組乘以常量:
a = np.array([1.0, 2.0, 3.0]) >>> b = 2.0 >>> a * b array([ 2., 4., 6.])
下面的例子和上面的例子是等價的,Numpy會自動將b進行擴展。
NumPy足夠聰明,可以使用原始標量值而無需實際制作副本,從而使廣播操作盡可能地節省內存并提高計算效率。
第二個示例中的代碼比第一個示例中的代碼更有效,因為廣播在乘法過程中移動的內存更少(b是標量而不是數組)。
如果兩個數組操作,NumPy會對兩個數組的對象進行比較,從最后一個維度開始,如果兩個數組的維度滿足下面的兩個條件,我們就認為這兩個數組是兼容的,可以進行運算:
維度中的元素個數是相同的
其中一個維數是1
如果上面的兩個條件不滿足的話,就會拋出異常: ValueError: operands could not be broadcast together。
維度中的元素個數是相同的,并不意味著要求兩個數組具有相同的維度個數。
比如表示顏色的256x256x3
數組,可以和一個一維的3個元素的數組相乘:
Image (3d array): 256 x 256 x 3 Scale (1d array): 3 Result (3d array): 256 x 256 x 3
相乘的時候,維度中元素個數是1的會被拉伸到和另外一個維度中的元素個數一致:
A (4d array): 8 x 1 x 6 x 1 B (3d array): 7 x 1 x 5 Result (4d array): 8 x 7 x 6 x 5
上面的例子中,第二維的1被拉伸到7,第三維的1被拉伸到6,第四維的1被拉伸到5。
還有更多的例子:
B (1d array): 1 Result (2d array): 5 x 4 A (2d array): 5 x 4 B (1d array): 4 Result (2d array): 5 x 4 A (3d array): 15 x 3 x 5 B (3d array): 15 x 1 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 5 Result (3d array): 15 x 3 x 5 A (3d array): 15 x 3 x 5 B (2d array): 3 x 1 Result (3d array): 15 x 3 x 5
下面是不匹配的例子:
A (1d array): 3 B (1d array): 4 # trailing dimensions do not match A (2d array): 2 x 1 B (3d array): 8 x 4 x 3 # second from last dimensions mismatched
再舉個實際代碼的例子:
>>> x = np.arange(4) >>> xx = x.reshape(4,1) >>> y = np.ones(5) >>> z = np.ones((3,4)) >>> x.shape (4,) >>> y.shape (5,) >>> x + y ValueError: operands could not be broadcast together with shapes (4,) (5,) >>> xx.shape (4, 1) >>> y.shape (5,) >>> (xx + y).shape (4, 5) >>> xx + y array([[ 1., 1., 1., 1., 1.], [ 2., 2., 2., 2., 2.], [ 3., 3., 3., 3., 3.], [ 4., 4., 4., 4., 4.]]) >>> x.shape (4,) >>> z.shape (3, 4) >>> (x + z).shape (3, 4) >>> x + z array([[ 1., 2., 3., 4.], [ 1., 2., 3., 4.], [ 1., 2., 3., 4.]])
廣播還提供了一個非常方便的進行兩個1維數組進行外部乘積的運算:
>>> a = np.array([0.0, 10.0, 20.0, 30.0]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a[:, np.newaxis] + b array([[ 1., 2., 3.], [ 11., 12., 13.], [ 21., 22., 23.], [ 31., 32., 33.]])
其中a[:, np.newaxis] 將1維的數組轉換成為4維的數組:
In [230]: a[:, np.newaxis]Out[230]:array([[ 0.], [10.], [20.], [30.]])
感謝各位的閱讀,以上就是“如何使用NumPy中的廣播”的內容了,經過本文的學習后,相信大家對如何使用NumPy中的廣播這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。