1. 程式人生 > >Python Numpy 100題實驗(五)uniform(),bincount()函式等

Python Numpy 100題實驗(五)uniform(),bincount()函式等

本篇的主要內容有:

  • numpy.random.uniform()
  • numpy.bincount()
  • numpy.nonzero()
  • numpy.random.choice()
  • numpy.put()

給定一個一位隨機陣列,找出離0.5最近的數字

距離最近的點,可以很自然地想到絕對值,首先根據絕對值計算每個數到0.5的距離,然後我們需要求出這個數的序號,可以使用argmax()函式很簡單地求得:

a = np.random.uniform(0, 1, 20)
print(a)
print(np.argmax(np.abs(a-0.5)))

另一種寫法,參考答案

a = np.random.uniform(0, 1, 20)
print("array A: ",a)
k = 0.5
m = a.flat[np.abs(a-k).argmin()]
print(m)

flat返回一個數組的迭代器,例如:

a = np.random.randint(1, 10, 4)
print(a)
for i in a.flat:
    print(i, end=' ')

將二維陣列的前兩行交換

當然可以使用迴圈的方式,但是有更簡單的交換方式,注意陣列如何取得某一行元素

a = np.random.randint(1,10, (3,3))
print(a)
a[[0,1]] = a[[1,0]]
print(a)

輸出:

[[6 2 1]
 [8 7 9]
 [1 3 3]]
[[8 7 9]
 [6 2 1]
 [1 3 3]]

找出陣列中出現頻率最高的數字

統計函式的應用

a = np.random.randint(0 ,10 ,10)
print(a)
print(np.bincount(a).argmax())

輸出:

[0 1 7 8 6 3 2 0 5 6]
0

這個統計函式返回的陣列,索引是元素的值,內容是該元素出現的次數,例如:

a = np.random.randint(1, 10, 10)
print(a)
print(np.bincount(a))

輸出:

[1 1 8 2 8 2 8 3 1 4]
[0 3 2 1 1 0 0 0 3]

bincount()函式輸出的結果中有9個元素,因為原來陣列的最大值是8,從0到8,共有九個元素,每一個元素的值代表次數。

找出給定一維陣列中非零元素的位置索引

一個函式搞定

a = np.random.randint(-1, 1, 5)
print(a)
print(np.nonzero(a))

輸出:

[-1  0  0 -1  0]
(array([0, 3], dtype=int64),)

numpy.nonzero()函式返回一個元組,記錄所有非零元素的索引,一維陣列的情況就是題目所說的,來看一下二維陣列的情況:

a = np.random.randint(-1, 1, (3,3))
print(a)
print(np.nonzero(a))

輸出:

[[ 0  0 -1]
 [ 0  0 -1]
 [-1  0 -1]]
(array([0, 1, 2, 2], dtype=int64), array([2, 2, 0, 2], dtype=int64))

輸出的其實是每個元素的座標,只是將這個矩陣扁平化了而已,例如,三維陣列的情況:

a = np.random.randint(-1,1,(2,2,2))
print(a)
print(np.nonzero(a))

輸出:

[[[-1 -1]
  [-1  0]]

 [[-1  0]
  [ 0  0]]]
  
  (array([0, 0, 0, 1], dtype=int64), array([0, 0, 1, 0], dtype=int64), array([0, 1, 0, 0], dtype=int64))

對於給定的5*5的陣列,在其中隨意放置p個1

p = 3
a = np.random.randint(1, 10, (5,5))
print('Array a:')
print(a)
a.put(a, np.random.choice(range(5*5), p, replace=False),1)
print('Result a:')
print(a)

這裡應用了兩個函式:

numpy.random.choice()函式

呼叫格式:numpy.random.choice(a, size=None, replace=True, p=None)

  • a:傳入的陣列,必須為一維陣列或者整型(此時為np.range())
  • size:返回的結果的size
  • replace:指定是否可以返回重複值
  • p:一維陣列,對應每個返回值的分佈,預設是標準分佈

例子:

a = np.random.randint(1, 10, 5)
print('Array a:')
print(a)
print('Size = None:')
print(np.random.choice(a, replace=False))
print('Size 1d:')
print(np.random.choice(a, 2, replace=False))
print('Size 2d:')
print(np.random.choice(a, (2,2), replace=False))

numpy.put()函式

呼叫格式:numpy.put(a, ind, v, mode=‘raise’)

  • a:傳入陣列
  • ind:
  • v:
  • mode:可選引數為raise,wrap,clip,預設是raise,主要是對陣列越界問題的處理,raise就是報一個error,clip則是將越界的索引處理為陣列的邊緣

例如:

a = np.random.randint(1, 10, 10)
print('Array a:')
print(a)
np.put(a, [0,2], [33,44])
print('Result: ')
print(a)

輸出:

Array a:
[3 8 9 8 9 1 3 1 6 7]
Result: 
[33  8  9  8  9  1 44  1  6  7]

mode為clip:

a = np.random.randint(1, 10, 3)
print('Array a:')
print(a)
np.put(a, [-1,6], [33,44],mode='clip')
print('Result: ')
print(a)

輸出:

Array a:
[5 4 6]
Result: 
[33  4 44]