2014-06-30 38 views
2

元组成的M×N维ndarray的名单上有元组下面的列表,整形numpy的

a=[('1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0), 
    ('1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031, 4.41336e-06, 0.522107), 
    ('1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757, 1.28505e-12, 0.480883), 
    ('1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0, 0.307837)] 

我想要做的是创造具有形状(4,8) 看起来像这样一个numpy的nd.array:

array([['1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], 
     ['1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031, 4.41336e-06, 0.522107], 
     ['1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757, 1.28505e-12, 0.480883], 
     ['1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0, 0.307837]]) 

我尝试下面的代码:

import numpy as np 
x = np.array(a, dtype=('a10,a10,f4,f4,f4,f4,f4,f4')) 

但它代之以这种形状:

In [37]: x.shape 
Out[37]: (4,) 

什么是正确的做法呢?

回答

1

你已经做了什么是迄今为止最合乎逻辑的做法。为了达到你的要求,你需要创建一个对象数组:

z = np.array(a,dtype=np.object) 
print z.shape 
# (4, 8) 

是什么样子,你所要求的是与列变量的数据类型的数组。这正是您通过np.array(a, dtype=('a10,a10,f4,f4,f4,f4,f4,f4'))获得的结果。在内部,您可以将此数组想象为C中的一个结构数组,即一个dtype=('a10,a10,f4,f4,f4,f4,f4,f4')实例的一维数组。

通过使用object数组,您可以请求numpy将所有内容都作为一个简单的python对象处理。

+0

非常感谢。使用'object'而不是'('a10,a10,f4,f4,f4,f4,f4,f4')'有没有[harm](http://stackoverflow.com/a/24482602/67405)? – neversaint

+0

我会假设使用'object'由于它的变量性质本质上会比较慢。这里的“伤害”会有些不可预知的行为,因为它不总是显而易见的是什么位宽数字。例如你的一半int可能是64位而另一半是32位。 – ebarr

+0

有没有比产生相同结果的'对象'更安全的选择? – neversaint