1. 程式人生 > >Python Numpy 100題實驗(六)mean(),set_printoptions()函式等

Python Numpy 100題實驗(六)mean(),set_printoptions()函式等

這一部分的主要內容:

  • numpy.mean()
  • 排序的一些例子
  • numpy.set_printoptions()

對於隨機的3*3的二維陣列,減去陣列的每一行的平均值

a = np.random.randint(1, 10, (3,3))
print('Array a:')
print(a)
a =a - a.mean(axis=1, keepdims=True)
print('Result a:')
print(a)

輸出:

Array a:
[[4 1 6]
 [9 5 3]
 [3 5 4]]
Result a:
[[ 0.33333333 -2.66666667  2.33333333]
 [ 3.33333333 -0.66666667 -2.66666667]
 [-1.          1.          0.        ]]

注意numpy.mean()函式的呼叫格式:

numpy.mean(a, axis=None, dtype=None, out=None, keepdims= )

至於keepdims有什麼作用,寫個例子看一下就清楚了:

a = np.random.randint(1, 10, (3,3))
print('Array a:')
print(a)
print('keepdims = None')
print(a.mean(axis=1))
print('keepdims = True')
print(a.mean(axis=1, keepdims=True))

輸出:

Array a:
[[7 8 1]
 [4 2 9]
 [6 7 4]]
keepdims = None
[5.33333333 5.         5.66666667]
keepdims = True
[[5.33333333]
 [5.        ]
 [5.66666667]]

獲得二維陣列點積結果的對角線陣列

a = np.random.randint(1, 10, (3,3))
b = np.random.randint(1, 10, (3,3))
print('Array a:')
print(a)
print('Array b:')
print(b)
print('Result:')
print(np.diag(a.dot(b)))

輸出:

Array a:
[[6 4 2]
 [3 2 5]
 [6 1 6]]
Array b:
[[7 5 4]
 [5 5 8]
 [8 2 6]]
Result:
[78 35 68]

這裡樣例中給出了更快速的兩種方法:

a = np.random.randint(1, 10, (3,3))
b = np.random.randint(1, 10, (3,3))
print('Array a:')
print(a)
print('Array b:')
print(b)
print('Result:')
print(np.diag(a.dot(b)))
print('Result2:')
print(np.sum(a * b.T, axis=1))
print('Result3:')
print(np.einsum("ij, ji->i", a, b))

輸出:

Array a:
[[2 7 3]
 [8 7 4]
 [1 2 9]]
Array b:
[[4 5 8]
 [9 7 2]
 [5 4 3]]
Result:
[ 86 105  39]
Result2:
[ 86 105  39]
Result3:
[ 86 105  39]

找到隨機一維陣列中前p個最大值

a = np.random.randint(1, 10, 5)
p = 3      #前p個最大值
print('Original array: ')
print(a)
b = sorted(a)[::-1]
print('Result:')
print(b[:p])

參考答案:

a = np.random.randint(1, 10, 5)
p = 3
print('Original array: ')
print(a)
print('Result:')
print(a[np.argsort(a)[-p:]])

輸出:

Original array: 
[1 5 9 2 3]
Result:
[3 5 9]

使用了argsort()函式,好吧,其實我學的還是不熟練。。。

計算隨機一維陣列中每個元素的4次方數值

使用陣列可以很方便地對陣列中所有的元素統一處理

a = np.random.randint(1, 10, 5)
print('Original array:')
print(a)
print('Result:')
print(np.power(a, 4))

輸出:

Original array:
[6 3 2 4 5]
Result:
[1296   81   16  256  625]

對於二維隨機陣列中的所有元素,保留2位小數

a = np.random.uniform(0, 3, (2,2))
print('Original array:')
print(a)
print('Result:')
print(np.floor(a*100)/100)

輸出:

Original array:
[[2.06304809 2.73927541]
 [1.09291699 0.25479813]]
Result:
[[2.06 2.73]
 [1.09 0.25]]

參考答案:

a = np.random.uniform(0, 3, (2))
print('Original array:')
print(a)
print('Result:')
np.set_printoptions(precision=2)
print(a)

直接設定了輸出格式,但是接下來所有的輸出都會有效,變為輸出兩位小數

使用科學記數法輸出Numpy陣列

a = np.random.random([3,3])
print(a/1e3)         # 注意這裡是數字1而非字母l

使用Numpy找出百分位數(25%, 50%, 75%)

a = np.arange(15)
print('Array a:')
print(a)
print('Result:')
print(np.percentile(a, q=[25, 50, 75]))

輸出:

Array a:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
Result:
[ 3.5  7.  10.5]