2014-10-03 56 views
2

假设我有一个带有各种数字数据类型的NumPy结构化数组。作为一个基本的例子,将具有各种数字数据类型的结构化数组转换为常规数组

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

我怎样才能铸造成浮动的规则与NumPy阵列呢?

this answer,我知道我可以使用

np.array(my_data.tolist()) 

但显然它是缓慢的,因为你“转换一个有效的填充NumPy的阵列到正规Python列表”。

+0

在上一个问题中,所有的字段都是相同的类型。 – hpaulj 2014-10-03 17:19:56

+0

我写了一个[快速脚本](https://gist.github.com/anonymous/74487ac64c2f69b781d5)查看30000x3000阵列中哪个答案是最快的,而且他们非常相似 - JohnZwinck's:0.30s,Jaime's :0.41s,hpaulj's:0.46s,Warren Weckesser:0.47s。他们都使用了大约3GB的内存。 – Garrett 2014-10-03 22:41:23

回答

1

你可以用大熊猫很容易做到这一点:

>>> import pandas as pd 
>>> pd.DataFrame(my_data).values 
array([[ 17.  , 182.1000061], 
     [ 19.  , 175.6000061]], dtype=float32) 
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) 
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) 
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 array。数据是一个带有4个浮点数的缓冲区。 my_data是一个包含2个元组的缓冲区,每个元组包含一个int和一个float(或[int float int float]的序列)。 my_data.itemsize==6。无论如何,my_data必须转换为所有浮点数,并且删除了元组分组。

但使用astype作为海梅显示没有问题:

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

在使用1000项阵列5场快速测试,通过现场复制领域是一样快,使用astype

相关问题