Python Numpy 100題實驗(三)diag()函式等
阿新 • • 發佈:2018-12-13
建立5*5的陣列,並設定1,2,3,4在對角線的下方:
使用numpy.diag()可以很方便的求出這個陣列
函式結構
diag(v, k=0)
引數說明
- v 傳入一個數組,如果是一維陣列,那麼就會以這個陣列為對角線元素建立一個對角矩陣,如果傳入的陣列多於一維,那麼會提取這個陣列的對角線元素
- k 可選引數,預設值是0,用來調整偏離對角線的距離
例子
#提取對角線元素 In [6]: c = np.random.randint(1,10, (3,3)) In [7]: c Out[7]: array([[7, 1, 9], [2, 8, 5], [2, 6, 2]]) In [8]: np.diag(c) Out[8]: array([7, 8, 2]) #提取對角線元素 新增偏移量k, 這樣對偏移量就很好理解了 In [21]: c = np.random.randint(1,10, (3,3)) In [22]: c Out[22]: array([[7, 8, 6], [3, 2, 6], [4, 9, 8]]) In [23]: np.diag(c, -1) Out[23]: array([3, 9]) #如果不是方陣,依然是對角線,多出來的列不考慮 In [24]: c = np.random.randint(1,10, (2,3)) In [26]: c Out[26]: array([[4, 2, 4], [9, 6, 7]]) In [25]: np.diag(c) Out[25]: array([4, 6]) #使用一維陣列建立對角陣 In [27]: a = np.random.randint(1, 10, 3) In [28]: a Out[28]: array([2, 7, 7]) In [29]: np.diag(a) Out[29]: array([[2, 0, 0], [0, 7, 0], [0, 0, 7]]) #建立對角矩陣 並傳入偏移量, 其實就是上面提取對角線元素的逆過程 In [30]: a = np.random.randint(1, 10, 3) In [31]: a Out[31]: array([3, 7, 5]) In [32]: np.diag(a, -1) Out[32]: array([[0, 0, 0, 0], [3, 0, 0, 0], [0, 7, 0, 0], [0, 0, 5, 0]])
所以,題目的解答可以這樣寫:
In [82]: c = np.diag(np.arange(1,5), k=-1)
In [83]: c
Out[83]:
array([[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 2, 0, 0, 0],
[0, 0, 3, 0, 0],
[0, 0, 0, 4, 0]])
建立10*10的陣列,要求:1,0沿著對角線間隔放置
陣列切片的綜合應用,關鍵在於兩種不同的行交替出現,找到這兩種規律就好了
In [40]: a = np.zeros((10, 10), dtype=np.int) In [41]: a[0::2, 1::2] = 1 In [42]: a[1::2, 0::2] = 1 In [43]: a Out[43]: array([[0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])
建立一個0-10的一維陣列,並將(1-9)之間的數字全部反轉成負數
In [96]: a = np.arange(11) In [97]: a[(a>1) & (a<=9)] *= -1 In [98]: a Out[98]: array([ 0, 1, -2, -3, -4, -5, -6, -7, -8, -9, 10]) In [99]: a = np.arange(11) In [100]: b = [-1*i if(i>1 and i<=9) else i for i in a] In [101]: b Out[101]: [0, 1, -2, -3, -4, -5, -6, -7, -8, -9, 10]
求兩個陣列的公共部分(交集)
集合運算
In [108]: np.intersect1d(a,b)
Out[108]: array([4, 7])
#注意這個intersect後面是數字1