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

Python 将具有各种数字数据类型的结构化数组转换为常规数组,python,arrays,numpy,structured-array,Python,Arrays,Numpy,Structured Array,假设我有一个NumPy结构数组,其中包含各种数字数据类型。作为一个基本的例子 my_data = np.array( [(17, 182.1), (19, 175.6)], dtype='i2,f4') 如何将其转换为常规的浮点数组 从,我知道我可以用 np.array(my_data.tolist()) 但显然这很慢,因为“将高效压缩的NumPy数组转换为常规Python列表”。使用Pandas可以轻松完成: >>> import pandas as pd >&

假设我有一个NumPy结构数组,其中包含各种数字数据类型。作为一个基本的例子

my_data = np.array( [(17, 182.1),  (19, 175.6)],  dtype='i2,f4')
如何将其转换为常规的浮点数组

从,我知道我可以用

np.array(my_data.tolist())

但显然这很慢,因为“将高效压缩的NumPy数组转换为常规Python列表”。

使用Pandas可以轻松完成:

>>> import pandas as pd
>>> pd.DataFrame(my_data).values
array([[  17.       ,  182.1000061],
       [  19.       ,  175.6000061]], dtype=float32)
这里有一种方法(假设
my_data
是一维结构化数组):

[26]中的
:我的_数据
出[26]:
数组([(17182.10000610351562),(19175.60000351562)],其中,
dtype=[('f0','显而易见的工作方式是:

>>> 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)
>>我的数据
数组([(17182.10000610351562),(19175.60000351562)],其中,

dtype=[('f0','沃伦答案的变体(按字段复制数据):

或者您可以按行进行迭代。
r
是一个元组。必须将其转换为列表才能填充一行
x
。如果行多字段少,则速度会较慢

for i,r in enumerate(my_data):
    x[i,:]=list(r)
尝试
x.data=r.data
,并得到一个错误可能是有益的:
AttributeError:数组的数据不足
x
数据是一个有4个浮点的缓冲区。
my_data
是一个有2个元组的缓冲区,每个元组包含一个int和一个浮点(或[int float int float]的序列).
my_data.itemsize==6
。无论如何,必须将
my_data
转换为所有浮点,并删除元组分组

但正如Jaime所示,使用astype确实有效:

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

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

的速度一样快。在前面的问题中,所有字段的类型都是相同的。我写这封信是想看看对于30000x3000数组,哪一个答案最快,它们非常相似——JohnZwinck的:0.30s,Jaime的:0.41s,hpaulj的:0.46秒,沃伦维克瑟:0.47秒。它们都使用了大约3GB的内存。
for i,r in enumerate(my_data):
    x[i,:]=list(r)
x.data=my_data.astype('f4,f4').data