Python Numpy 100題實驗(五)uniform(),bincount()函式等
阿新 • • 發佈:2018-12-13
本篇的主要內容有:
- 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]