1. 程式人生 > 實用技巧 >初探numpy——廣播和陣列操作函式

初探numpy——廣播和陣列操作函式

numpy廣播(Broadcast)

若陣列a,b形狀相同,即a.shape==b.shape,那麼a+b,a*b的結果就是對應數位的運算

import numpy as np

a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1,4,7],[2,5,8]]) print(a+b,'\n')
print(a*b)
[[ 2  6 10]
[ 6 10 14]] [[ 1 8 21]
[ 8 25 48]]

若兩個陣列形狀不同,且有一個陣列維度為1,則會觸發廣播機制

a=np.array([[1,2,3],[4,5,6]])
b=np.array([1,2,3]) # 等同於np.array([[1,2,3],[4,5,6]])與np.array([1,2,3],[1,2,3])運算
print(a+b,'\n')
print(a*b)
[[2 4 6]
[5 7 9]] [[ 1 4 9]
[ 4 10 18]]

numpy陣列操作函式

修改陣列形狀

numpy.reshape()

不改變資料的情況下修改形狀

numpy.reshape(array , newshape , order = 'C')
引數 描述
array 要修改形狀的陣列
newshape 整數或整數陣列,新的形狀應該相容原有形狀
order 'C'——按行,'F'——按列,'A'——原順序,'K'——元素咋記憶體中出現的順序
import numpy as np

a_array=np.arange(16)
print(a_array,'\n') b_array=np.reshape(a_array,[4,4])
print(b_array,'\n') # 也可以打點呼叫
c_array=a_array.reshape([2,8])
print(c_array)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15] 

[[ 0  1  2  3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]] [[ 0 1 2 3 4 5 6 7]
[ 8 9 10 11 12 13 14 15]]

numpy.ndarray.flat

numpy.ndarray.flat為陣列元素迭代器

array=np.arange(9).reshape([3,3])
print(array,'\n') # 按行遍歷陣列
for row in array:
print(row) # 使用陣列元素迭代器
for element in array.flat:
print(element)
[[0 1 2]
[3 4 5]
[6 7 8]] [0 1 2]
[3 4 5]
[6 7 8]
0
1
2
3
4
5
6
7
8

numpy.ndarray.flatten和numpy.ravel

  • numpy扁平化函式
  • numpy.ndarray.flatten返回一份陣列拷貝,對拷貝內容的修改不影響原始數值;
  • numpy.ravel返回一個陣列的檢視,修改檢視時會影響原始陣列
numpy.ndarray.flatten(order = 'C')
numpy.ravel(order = 'C')
引數 描述
order 'C'——按行,'F'——按列,'A'——原順序,'K'——元素咋記憶體中出現的順序
array=np.arange(16).reshape([4,4])
print(array,'\n') print(array.flatten(),'\n')
print(array.ravel())
[[ 0  1  2  3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
a_array=np.arange(16).reshape([4,4])
print(a_array,'\n') #建立和a_array同樣的陣列b_array
b_array=a_array.copy() c_array=a_array.ravel()
d_array=array.flatten() print('c_array:')
print(c_array)
print('d_array:')
print(d_array,'\n') c_array[1]=100
d_array[1]=100 print('a_array:')
print(a_array)
print('b_array:')
print(b_array,'\n')
[[ 0  1  2  3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]] c_array:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
d_array:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] a_array:
[[ 0 100 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 12 13 14 15]]
b_array:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]

翻轉陣列

transpose和ndarray.T

  • numpy陣列轉置函式
a_array=np.arange(16).reshape([4,4])
print('a_array:\n',a_array) print('使用transpose後:')
print(np.transpose(a_array))
print('使用.T轉置後:')
print(a_array.T)
a_array:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
使用transpose後:
[[ 0 4 8 12]
[ 1 5 9 13]
[ 2 6 10 14]
[ 3 7 11 15]]
使用.T轉置後:
[[ 0 4 8 12]
[ 1 5 9 13]
[ 2 6 10 14]
[ 3 7 11 15]]

numpy.swapaxes

  • numpy用於交換陣列兩個軸的函式
numpy.swapaxes(arr , axis1, axis2)
引數 描述
arr 輸入陣列
axis1 對應陣列第一個軸
axis2 對應陣列第二個軸
array=np.arange(8).reshape(2,2,2)
print(array) # 交換第零個軸和第二個軸
print(np.swapaxes(array,0,2))
[[[0 1]
[2 3]] [[4 5]
[6 7]]]
[[[0 4]
[2 6]] [[1 5]
[3 7]]]
(0)000->(0)000 (1)001->(4)100
(2)010->(2)010 (3)011->(6)110
(4)100->(1)001 (5)101->(5)101
(6)110->(3)011 (7)111->(7)111