将具有各种数字数据类型的结构化数组转换为常规数组

时间:2014-10-03 08:19:27

标签: python arrays numpy structured-array

假设我有一个具有各种数值数据类型的NumPy结构化数组。作为一个基本的例子,

my_data = np.array( [(17, 182.1),  (19, 175.6)],  dtype='i2,f4')

如何将其转换为常规的NumPy浮点数组?

来自this answer,我知道我可以使用

np.array(my_data.tolist())

但显然它很慢,因为你将高效打包的NumPy数组转换为常规的Python列表"。

4 个答案:

答案 0 :(得分:1)

您可以使用Pandas轻松完成:

>>> import pandas as pd
>>> pd.DataFrame(my_data).values
array([[  17.       ,  182.1000061],
       [  19.       ,  175.6000061]], dtype=float32)

答案 1 :(得分:1)

这是一种方式(假设my_data是一维结构化数组):

In [26]: my_data
Out[26]: 
array([(17, 182.10000610351562), (19, 175.60000610351562)], 
      dtype=[('f0', '<i2'), ('f1', '<f4')])

In [27]: np.column_stack(my_data[name] for name in my_data.dtype.names)
Out[27]: 
array([[  17.       ,  182.1000061],
       [  19.       ,  175.6000061]], dtype=float32)

答案 2 :(得分:1)

显而易见的方式:

>>> my_data
array([(17, 182.10000610351562), (19, 175.60000610351562)],
      dtype=[('f0', '<i2'), ('f1', '<f4')])
>>> n = len(my_data.dtype.names)  # n == 2
>>> my_data.astype(','.join(['f4']*n))
array([(17.0, 182.10000610351562), (19.0, 175.60000610351562)],
      dtype=[('f0', '<f4'), ('f1', '<f4')])
>>> my_data.astype(','.join(['f4']*n)).view('f4')
array([  17.       ,  182.1000061,   19.       ,  175.6000061], dtype=float32)
>>> my_data.astype(','.join(['f4']*n)).view('f4').reshape(-1, n)
array([[  17.       ,  182.1000061],
       [  19.       ,  175.6000061]], dtype=float32)

答案 3 :(得分:0)

沃伦答案的变体(按字段复制数据):

x = np.empty((my_data.shape[0],len(my_data.dtype)),dtype='f4')
for i,n in enumerate(my_data.dtype.names):
    x[:,i]=my_data[n]

或者你可以按行迭代。 r是一个元组。必须将其转换为列表才能填充x行。有很多行和很少的字段,这将会更慢。

for i,r in enumerate(my_data):
    x[i,:]=list(r)

尝试x.data=r.data可能会有所帮助,并收到错误:AttributeError: not enough data for arrayx数据是一个包含4个浮点数的缓冲区。 my_data是一个包含2个元组的缓冲区,每个元组包含一个int和一个float(或者[int float int float]的序列)。 my_data.itemsize==6。无论如何,my_data必须转换为所有浮点数,并删除元组分组。

但使用astype作为Jaime节目确实有效:

x.data=my_data.astype('f4,f4').data

在使用包含5个字段的1000项数组的快速测试中,逐字段复制与使用astype一样快。