Numpy高級應用
1.ndarray對象內部機理
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import warnings
warnings.filterwarnings("ignore")
略
2.高級數組操作
arr = np.arange(8)
arr
array([0, 1, 2, 3, 4, 5, 6, 7])
arr_new = arr.reshape((4,2))
arr_new
array([[0, 1],
[2, 3],
[4, 5],
[6, 7]])
arr
array([0, 1, 2, 3, 4, 5, 6, 7])
# 數組的合併
a1 = np.arange(6).reshape(2,3)
a2 = np.arange(6).reshape(2,3)
a1
array([[0, 1, 2],
[3, 4, 5]])
a2
array([[0, 1, 2],
[3, 4, 5]])
a = np.concatenate([a1,a2],axis=0)
a
array([[0, 1, 2],
[3, 4, 5],
[0, 1, 2],
[3, 4, 5]])
b = np.concatenate([a1,a2],axis=1)
b
array([[0, 1, 2, 0, 1, 2],
[3, 4, 5, 3, 4, 5]])
# 數組的拆分
b
array([[0, 1, 2, 0, 1, 2],
[3, 4, 5, 3, 4, 5]])
c1,c2,c3 = np.hsplit(b,[2,4])
c1
array([[0, 1],
[3, 4]])
c2
array([[2, 0],
[5, 3]])
c3
array([[1, 2],
[4, 5]])
3.廣播
b
array([[0, 1, 2, 0, 1, 2],
[3, 4, 5, 3, 4, 5]])
b.mean()
2.5
demened = b-b.mean()
demened
array([[-2.5, -1.5, -0.5, -2.5, -1.5, -0.5],
[ 0.5, 1.5, 2.5, 0.5, 1.5, 2.5]])
廣播的原則
如果兩個數組的後緣維度 (trailing dimension,即從末尾開始算起的維度) 的軸長度相符或其中一方的長度爲1,則認爲它們是廣播兼容的。廣播會在缺失和 (或)長度爲1的維度上進行。
c = np.arange(12).reshape((4,3))
c
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
mean(0) 表示沿着第一個軸(通常是行)計算均值。對於一個矩陣,這將返回每列的均值。
mean(1) 表示沿着第一個軸(通常是列)計算均值。對於一個矩陣,這將返回每行的均值。
例如, 如果 c 是一個 3x4 的矩陣,c.mean(0) 將返回一個包含 4 個元素的數組,每個元素是相應列的均值。
row_means_x = c.mean(1)
row_means_x
array([ 1., 4., 7., 10.])
row_means_y = c.mean(0)
row_means_y
array([4.5, 5.5, 6.5])
row_means_x.reshape((4,1))
array([[ 1.],
[ 4.],
[ 7.],
[10.]])
demened = c - row_means_x.reshape((4,1))
demened
array([[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.],
[-1., 0., 1.]])
案例
import numpy as np
# 創建一個三維數組 A,形狀爲 (3, 1, 4)
A = np.array([[[1, 2, 3, 4]] * 1, [[5, 6, 7, 8]] * 1, [[9, 10, 11, 12]] * 1])
# 創建一個一維數組 B,形狀爲 (4,)
B = np.array([0, 1, 2, 3])
# 廣播數組 B 到數組 A
result = A + B
# 輸出結果
print(result)
[[[ 1 3 5 7]]
[[ 5 7 9 11]]
[[ 9 11 13 15]]]
假設我們有一個三維數組 A 和一個二維數組 B,它們的形狀分別爲 (3, 2, 4) 和 (2, 4)。我們將嘗試對它們進行相加操作,利用廣播規則。
import numpy as np
# 創建一個三維數組 A,形狀爲 (3, 2, 4)
A = np.random.randint(1, 10, size=(3, 2, 4))
# 創建一個二維數組 B,形狀爲 (2, 4)
B = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]])
# 廣播數組 B 到數組 A
result = A + B
# 輸出原始數組 A 和 B
print("Array A:")
print(A)
print("\nArray B:")
print(B)
# 輸出廣播後的結果數組
print(result)
Array A:
[[[7 6 2 3]
[3 6 9 3]]
[[4 6 6 9]
[9 8 9 7]]
[[3 7 1 7]
[2 2 2 8]]]
Array B:
[[1 2 3 4]
[5 6 7 8]]
Broadcasted Result:
[[[ 8 8 5 7]
[ 8 12 16 11]]
[[ 5 8 9 13]
[14 14 16 15]]
[[ 4 9 4 11]
[ 7 8 9 16]]]