翼度科技»论坛 编程开发 python 查看内容

【numpy基础】--结构化

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
目前为止,介绍的numpy数组基本都是关于数值的,其实,numpy本身就是一个用于数值计算的基础库。
不过,除了数值计算之外,numpy也能够支持结构化数组
1. 关联不同类型数据

numpy的数组为了提高计算性能,要求数组的数据类型要一致。
但是现实情况下,我们经常遇到不是纯数值的数组,比如:
  1. name = ["harry", "tom", "annie"]
  2. sex = ["male", "male", "female"]
  3. age = [40, 31, 14]
  4. arr = np.array([name, sex, age])
  5. print(arr)
  6. #运行结果
  7. [['harry' 'tom' 'annie']
  8. ['male' 'male' 'female']
  9. ['40' '31' '14']]
复制代码
上面三个数组的类型不一致,放到一个numpy数组中时,可以看出,age数组被自动转换为字符串类型了。
为了保持 age 数组的原有数据类型,就要用到numpy的结构化数组了。
  1. arr = np.zeros(
  2.     3,
  3.     dtype={"names": ("name", "sex", "age"),
  4.            "formats": ("U10", "U10", "i4")},
  5. )
  6. print(arr)
  7. #运行结果
  8. [('', '', 0) ('', '', 0) ('', '', 0)]
  9. arr["name"] = name
  10. arr["sex"] = sex
  11. arr["age"] = age
  12. print(arr)
  13. #运行结果
  14. [('harry', 'male', 40)
  15. ('tom', 'male', 31)
  16. ('annie', 'female', 14)]
复制代码
定义数组时,定义不同的names和formats,这样,最后得到了结构化的数组,每个元素是一个元组元组中的三个元素分别是name,sex,age。
这样的数组,保持了原数组的数据的类型。
补充:上面代码中的 U10 表示长度小于10 的字符串,i4 表示占4个字节的整数。
2. 结构化数组

生成结构化数组的关键在于定义不同的数据类型。
定义数据了类型有两种方式:
第一种是用字典,类似上面的示例那样,
  1. dtp = np.dtype(
  2.     {"names": ("name", "sex", "age"),
  3.      "formats": ("U10", "U10", "i4")}
  4. )
  5. arr = np.zeros(3, dtype=dtp)
  6. arr["name"] = name
  7. arr["sex"] = sex
  8. arr["age"] = age
  9. print(arr)
  10. #运行结果
  11. [('harry', 'male', 40)
  12. ('tom', 'male', 31)
  13. ('annie', 'female', 14)]
复制代码
还有一种方式是用元组列表来定义:
  1. dtp = np.dtype([
  2.     ("name", "U10"),
  3.     ("sex", "U10"),
  4.     ("age", "i4")
  5. ])
  6. arr = np.zeros(3, dtype=dtp)
  7. arr["name"] = name
  8. arr["sex"] = sex
  9. arr["age"] = age
  10. print(arr)
  11. #运行结果
  12. [('harry', 'male', 40)
  13. ('tom', 'male', 31)
  14. ('annie', 'female', 14)]
复制代码
两种方式定义出的结构化数组是一样的。
3. 更复杂的结构

除了定义上面那种类似excel表格的二维结构之外,numpy的数组也能定义跟复杂的结构。
比如定义学生的成绩列表:
  1. dtp = np.dtype([("name", "U10"), ("scores", "f4", (3))])
  2. arr = np.zeros(3, dtype=dtp)
  3. print(arr)
  4. #运行结果
  5. [('', [0., 0., 0.])
  6. ('', [0., 0., 0.])
  7. ('', [0., 0., 0.])]
  8. arr["name"] = ["harry", "tom", "annie"]
  9. arr["scores"] = [[100, 95.5, 93], [89, 90, 78.5], [77.5, 76, 90]]
  10. print(arr)
  11. #运行结果
  12. [('harry', [100. ,  95.5,  93. ])
  13. ('tom', [ 89. ,  90. ,  78.5])
  14. ('annie', [ 77.5,  76. ,  90. ])]
复制代码
每个学生对应一个成绩列表,列表中包含3个成绩。
4. 总结回顾

总的来说,numpy的结构化数组并不常用,对于结构化数组,使用 pandas库来操作更好。
numpy库一般作为纯数值计算的底层来使用,其实pandas也是基于 numpy 的。
此外,还有很多其他的python科学计算的库也是基于numpy的。

来源:https://www.cnblogs.com/wang_yb/p/17532130.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具