目前為止,介紹的`numpy`數組基本都是關於數值的,其實,`numpy`本身就是一個用於數值計算的基礎庫。 不過,除了數值計算之外,`numpy`也能夠支持**結構化數組**。 # 1. 關聯不同類型數據 `numpy`的數組為了提高計算性能,要求數組的數據類型要一致。但是現實情況下,我們經常遇到 ...
目前為止,介紹的numpy
數組基本都是關於數值的,其實,numpy
本身就是一個用於數值計算的基礎庫。
不過,除了數值計算之外,numpy
也能夠支持結構化數組。
1. 關聯不同類型數據
numpy
的數組為了提高計算性能,要求數組的數據類型要一致。
但是現實情況下,我們經常遇到不是純數值的數組,比如:
name = ["harry", "tom", "annie"]
sex = ["male", "male", "female"]
age = [40, 31, 14]
arr = np.array([name, sex, age])
print(arr)
#運行結果
[['harry' 'tom' 'annie']
['male' 'male' 'female']
['40' '31' '14']]
上面三個數組的類型不一致,放到一個numpy
數組中時,可以看出,age
數組被自動轉換為字元串類型了。
為了保持 age
數組的原有數據類型,就要用到numpy
的結構化數組了。
arr = np.zeros(
3,
dtype={"names": ("name", "sex", "age"),
"formats": ("U10", "U10", "i4")},
)
print(arr)
#運行結果
[('', '', 0) ('', '', 0) ('', '', 0)]
arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#運行結果
[('harry', 'male', 40)
('tom', 'male', 31)
('annie', 'female', 14)]
定義數組時,定義不同的names
和formats
,這樣,最後得到了結構化的數組,每個元素是一個元組,元組中的三個元素分別是name
,sex
,age
。
這樣的數組,保持了原數組的數據的類型。
補充:上面代碼中的 U10
表示長度小於10 的字元串,i4
表示占4個位元組的整數。
2. 結構化數組
生成結構化數組的關鍵在於定義不同的數據類型。
定義數據了類型有兩種方式:
第一種是用字典,類似上面的示例那樣,
dtp = np.dtype(
{"names": ("name", "sex", "age"),
"formats": ("U10", "U10", "i4")}
)
arr = np.zeros(3, dtype=dtp)
arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#運行結果
[('harry', 'male', 40)
('tom', 'male', 31)
('annie', 'female', 14)]
還有一種方式是用元組列表來定義:
dtp = np.dtype([
("name", "U10"),
("sex", "U10"),
("age", "i4")
])
arr = np.zeros(3, dtype=dtp)
arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#運行結果
[('harry', 'male', 40)
('tom', 'male', 31)
('annie', 'female', 14)]
兩種方式定義出的結構化數組是一樣的。
3. 更複雜的結構
除了定義上面那種類似excel
表格的二維結構之外,numpy
的數組也能定義跟複雜的結構。
比如定義學生的成績列表:
dtp = np.dtype([("name", "U10"), ("scores", "f4", (3))])
arr = np.zeros(3, dtype=dtp)
print(arr)
#運行結果
[('', [0., 0., 0.])
('', [0., 0., 0.])
('', [0., 0., 0.])]
arr["name"] = ["harry", "tom", "annie"]
arr["scores"] = [[100, 95.5, 93], [89, 90, 78.5], [77.5, 76, 90]]
print(arr)
#運行結果
[('harry', [100. , 95.5, 93. ])
('tom', [ 89. , 90. , 78.5])
('annie', [ 77.5, 76. , 90. ])]
每個學生對應一個成績列表,列表中包含3個成績。
4. 總結回顧
總的來說,numpy
的結構化數組並不常用,對於結構化數組,使用 pandas
庫來操作更好。numpy
庫一般作為純數值計算的底層來使用,其實pandas
也是基於 numpy
的。
此外,還有很多其他的python
科學計算的庫也是基於numpy
的。