Python 将具有各种数字数据类型的结构化数组转换为常规数组
假设我有一个NumPy结构数组,其中包含各种数字数据类型。作为一个基本的例子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 >&
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