1. 程式人生 > 實用技巧 >培訓1-陣列運算

培訓1-陣列運算

一、組數的廣播

如果兩個陣列的後緣維度(即:從末尾開始算起的維度)的軸長相符或其中一方的長度為1,則認為它們是廣播相容的,廣播會在缺失和(或)長度為1的軸上進行

也就是說維度(ndim)不同,那麼就會在最左邊補上1,直至維度一值,最後只會在shape=1的軸(不管是左邊的陣列還是右邊的陣列)上進行廣播,這樣如果任一shape上面不匹配,將不能運算

  • 規則1:如果兩個陣列的維度不相同,那麼小維度陣列的形狀將會在最左邊補1.
  • 規則2:如果兩個陣列的形狀在任何一個維度上都不匹配,那麼陣列的形狀會沿著維度為1擴充套件以匹配另外一個數組的形狀。
  • 規則3:如果兩個陣列的形狀在任何一個維度上都不匹配並且沒有任何一個維度為1,那麼會引起異常。

維度都一樣且shape也一樣

import numpy as np
a=np.arange(10)
b=np.arange(10)
print(a.ndim)  #1
print(b.ndim)  #1
a*b  #array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

維度和一個標量

import numpy as np
a=np.arange(10)
b=10
a*b  #array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

維度不一樣,首先b先在最左邊補上1,也就變成b(1,3),然後再在shape=1的軸上廣播

import
numpy as np a=np.arange(9).reshape(3,3) b=np.arange(3) print(a.ndim) #2 print(b.ndim) #1 a*b ''' array([[ 0, 1, 4], [ 0, 4, 10], [ 0, 7, 16]]) '''

兩個陣列都廣播a(2,1)*b(3,)

import numpy as np
a=np.arange(2).reshape(2,1)
b=np.arange(3)
print(a.ndim)  #2
print(b.ndim)  #1
b*a
'''
2
1
array([[0, 0, 0],
       [0, 1, 2]])
'''

這裡說一下後緣維度,比如說a(2,3,4),b(3,4)這樣也可以廣播,其實維度不一致時,只要維度少的陣列的shape值(shape=1不算)等於另一個數組對應的shape(不等於1,且從後面數起)就可以廣播,比如a(1,3)*b(3,),但是不等於a(1,3)*b(4,),就不可以廣播了

import numpy as np
a=np.arange(9).reshape(3,3)
b=np.arange(4)
print(a.ndim)  #2
print(b.ndim)  #1
a*b  
#ValueError: operands could not be broadcast together with shapes (3,3) (4,)

利用廣播去做乘法口訣

#九九乘法
import numpy as np
a=np.arange(1,10).reshape(9,1)
b=np.arange(1,10)
print(a*b)
[[ 1  2  3  4  5  6  7  8  9]
 [ 2  4  6  8 10 12 14 16 18]
 [ 3  6  9 12 15 18 21 24 27]
 [ 4  8 12 16 20 24 28 32 36]
 [ 5 10 15 20 25 30 35 40 45]
 [ 6 12 18 24 30 36 42 48 54]
 [ 7 14 21 28 35 42 49 56 63]
 [ 8 16 24 32 40 48 56 64 72]
 [ 9 18 27 36 45 54 63 72 81]]

利用迴圈做乘法口訣

for i in range(1,10): # 設定迴圈次數9次
    row = ""
    for j in range(1,i+1):
        row += "{0}*{1}={2} ".format(j,i,i*j)
    print(row)  # 輸出每行資料
1*1=1 
1*2=2 2*2=4 
1*3=3 2*3=6 3*3=9 
1*4=4 2*4=8 3*4=12 4*4=16 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81