為了了解這個原則,首先我們來看一組例子:
# 陣列直接對乙個數進行加減乘除,產生的結果是陣列中的每個元素都會加減乘除這個數。
in [12]: import numpy as np
in [13]: a = np.arange(1,13).reshape((4, 3))
in [14]: a * 2
out[14]: array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18],
[20, 22, 24]])
# 接下來我們看一下陣列與陣列之間的計算
in [17]: b = np.arange(12,24).reshape((4,3))
in [18]: b
out[18]: array([[12, 13, 14],
[15, 16, 17],
[18, 19, 20],
[21, 22, 23]])
in [19]: a + b
out[19]: array([[13, 15, 17],
[19, 21, 23],
[25, 27, 29],
[31, 33, 35]])
in [20]: c = np.array([1,2,3])
in [21]: a+c
out[21]: array([[ 2, 4, 6],
[ 5, 7, 9],
[ 8, 10, 12],
[11, 13, 15]])
in [22]: d = np.arange(10,14).reshape((4,1))
in [23]: d
out[23]: array([[10],
[11],
[12],
[13]])
in [24]: a + d
out[24]: array([[11, 12, 13],
[15, 16, 17],
[19, 20, 21],
[23, 24, 25]])
# 從上面可以看出,和線性代數中不同的是,m*n列的m行的一維陣列或者n列的一維陣列也是可以計算的。
這是為什麼呢?這裡要提到numpy的廣播原則:
如果兩個陣列的後緣維度(從末尾開始算起的維度)的軸長度相符或其中一方的長度為1,則認為它們是廣播相容的。廣播會在缺失維度和(或)軸長度為1的維度上進行。在上面的**中,a的維度是(4,3),c的維度是(1,3);d的維度是(4,1)。所以假設有兩個陣列,第乙個的維度是(x_1, y_1, z_1),另乙個陣列的維度是(x_2, y_2, z_2),要判斷這兩個陣列能不能進行計算,可以用如下方法來判斷:
if z_1 == z_2 or z_1 == 1 or z_2 == 1:
if y_1 == y_2 or y_1 == 1 or y_2 == 1:
if x_1 == x_2 or x_1 == 1 or x_2 == 1:
可以運算
else:
不可以運算
else:
不可以運算
else:
不可以運算
這裡需要注意:(3,3,2)和(3,2)是可以運算的,因為對於二維陣列(3,2)也可以表示為(1,3,2),套用上述的規則是完全適用的,同理:(4,2,5,4)和(2,1,4)也是可以進行運算的。 numpy中的廣播機制
numpy兩個陣列的相加 相減以及相乘都是對應元素之間的操作。import numpy as np x np.array 2,2,3 1,2,3 y np.array 1,1,3 2,2,4 print x y numpy當中的陣列相乘是對應元素的乘積,與線性代數當中的矩陣相乘不一樣 輸入結果如下 ...
numpy中的廣播機制
結論 廣播原則 如果兩個陣列的後緣維度 即 從末尾開始算起的維度 的軸長相符或其中一方的長度為1,則認為它們是廣播相容的,廣播會在缺失和 或 長度為1的軸上進行.1.讓所有輸入陣列都向其中shape最長的陣列看齊,shape中不足的部分都通過在前面加1補齊 2.輸出陣列的shape是輸入陣列shap...
numpy廣播機制
1.廣播法則是為了更好的處理不同維數矩陣之間的運算 1 廣播第一法則是,如果所有的輸入陣列維度不都相同,乙個 1 將被重複地新增在維度較小的陣列上直至所有的陣列擁有一樣的維度。2 廣播第二法則確定長度為1的陣列沿著特殊的方向表現地好像它有沿著那個方向最大形狀的大小。對陣列來說,沿著那個維度的陣列元素...