目前為止,介紹的numpy
數(shù)組基本都是關(guān)于數(shù)值的,其實(shí),numpy
本身就是一個(gè)用于數(shù)值計(jì)算的基礎(chǔ)庫。
不過,除了數(shù)值計(jì)算之外,numpy
也能夠支持結(jié)構(gòu)化數(shù)組。
1. 關(guān)聯(lián)不同類型數(shù)據(jù)
numpy
的數(shù)組為了提高計(jì)算性能,要求數(shù)組的數(shù)據(jù)類型要一致。
但是現(xiàn)實(shí)情況下,我們經(jīng)常遇到不是純數(shù)值的數(shù)組,比如:
name = ["harry", "tom", "annie"]
sex = ["male", "male", "female"]
age = [40, 31, 14]
arr = np.array([name, sex, age])
print(arr)
#運(yùn)行結(jié)果
[['harry' 'tom' 'annie']
['male' 'male' 'female']
['40' '31' '14']]
上面三個(gè)數(shù)組的類型不一致,放到一個(gè)numpy
數(shù)組中時(shí),可以看出,age
數(shù)組被自動(dòng)轉(zhuǎn)換為字符串類型了。
為了保持 age
數(shù)組的原有數(shù)據(jù)類型,就要用到numpy
的結(jié)構(gòu)化數(shù)組了。
arr = np.zeros(
3,
dtype={"names": ("name", "sex", "age"),
"formats": ("U10", "U10", "i4")},
)
print(arr)
#運(yùn)行結(jié)果
[('', '', 0) ('', '', 0) ('', '', 0)]
arr["name"] = name
arr["sex"] = sex
arr["age"] = age
print(arr)
#運(yùn)行結(jié)果
[('harry', 'male', 40)
('tom', 'male', 31)
('annie', 'female', 14)]
定義數(shù)組時(shí),定義不同的names
和formats
,這樣,最后得到了結(jié)構(gòu)化的數(shù)組,每個(gè)元素是一個(gè)元組,元組中的三個(gè)元素分別是name
,sex
,age
。
這樣的數(shù)組,保持了原數(shù)組的數(shù)據(jù)的類型。
補(bǔ)充:上面代碼中的 U10
表示長度小于10 的字符串,i4
表示占4個(gè)字節(jié)的整數(shù)。
2. 結(jié)構(gòu)化數(shù)組
生成結(jié)構(gòu)化數(shù)組的關(guān)鍵在于定義不同的數(shù)據(jù)類型。
定義數(shù)據(jù)了類型有兩種方式:
第一種是用字典,類似上面的示例那樣,
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)
#運(yùn)行結(jié)果
[('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)
#運(yùn)行結(jié)果
[('harry', 'male', 40)
('tom', 'male', 31)
('annie', 'female', 14)]
兩種方式定義出的結(jié)構(gòu)化數(shù)組是一樣的。
3. 更復(fù)雜的結(jié)構(gòu)
除了定義上面那種類似excel
表格的二維結(jié)構(gòu)之外,numpy
的數(shù)組也能定義跟復(fù)雜的結(jié)構(gòu)。
比如定義學(xué)生的成績列表:
dtp = np.dtype([("name", "U10"), ("scores", "f4", (3))])
arr = np.zeros(3, dtype=dtp)
print(arr)
#運(yùn)行結(jié)果
[('', [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)
#運(yùn)行結(jié)果
[('harry', [100. , 95.5, 93. ])
('tom', [ 89. , 90. , 78.5])
('annie', [ 77.5, 76. , 90. ])]
每個(gè)學(xué)生對應(yīng)一個(gè)成績列表,列表中包含3個(gè)成績。
4. 總結(jié)回顧
總的來說,numpy
的結(jié)構(gòu)化數(shù)組并不常用,對于結(jié)構(gòu)化數(shù)組,使用 pandas
庫來操作更好。numpy
庫一般作為純數(shù)值計(jì)算的底層來使用,其實(shí)pandas
也是基于 numpy
的。文章來源:http://www.zghlxwxcb.cn/news/detail-525561.html
此外,還有很多其他的python
科學(xué)計(jì)算的庫也是基于numpy
的。文章來源地址http://www.zghlxwxcb.cn/news/detail-525561.html
到了這里,關(guān)于【numpy基礎(chǔ)】--結(jié)構(gòu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!