Numpy结构化数组

Numpy结构化数组

Numpy的结构化数组和记录数组为复合的、异构的的数据提供了非常有效的存储。

结构化数组

In [1]: import numpy as np

In [2]: name = ['A','B','C','D']
In [3]: age = [23,34,23,45]
In [4]: weight = [100,120,124,127]
In [5]: x = np.zeros(4,dtype=int)

In [6]: x
Out[6]: array([0, 0, 0, 0])
    
#通过字典创建复合类型
In [7]: data = np.zeros(4,dtype={'names':('name','age','weight'),'formats':('U10','i4','f8')})
In [8]: data
Out[8]:
array([('', 0, 0.), ('', 0, 0.), ('', 0, 0.), ('', 0, 0.)],
      dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])


In [10]: data['name'] = name
In [11]: data['age'] = age
In [12]: data['weight'] = weight

In [13]: data
Out[13]:
array([('A', 23, 100.), ('B', 34, 120.), ('C', 23, 124.), ('D', 45, 127.)],
      dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])

In [14]: data[data['age']<30]
Out[14]:
array([('A', 23, 100.), ('C', 23, 124.)],
      dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])

#通过元组列表创建复合类型
In [15]: data2 = np.zeros(4,dtype=([('name','S10'),('age','i4'),('weight','f8')]))
In [16]: data2
Out[16]:
array([(b'', 0, 0.), (b'', 0, 0.), (b'', 0, 0.), (b'', 0, 0.)],
      dtype=[('name', 'S10'), ('age', '<i4'), ('weight', '<f8')])

记录数组

域可以像属性一样访问。

In [17]: data['age']
Out[17]: array([23, 34, 23, 45])
#通过np.recarray类创建一个记录数组
In [18]: data_rec = data.view(np.recarray)

In [19]: data_rec.age
Out[19]: array([23, 34, 23, 45])

In [20]: %timeit data['age']
82.4 ns ± 0.669 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
#访问时间比直接访问更快
In [22]: %timeit data_rec['age']
2.22 µs ± 32.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#通过属性访问
In [23]: %timeit data_rec.age
2.92 µs ± 44.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
posted @ 2021-12-23 12:57  溪奇的数据  阅读(75)  评论(0编辑  收藏  举报