2013-03-28 80 views
0

我试图用现有数组的元素创建一个新数组。我不断收到:ValueError:使用缓冲区设置对象成员的void-array。在尝试创建数组时尝试使用numpy保持ValueError

import numpy as np 
import datetime 

date = datetime.date(2013, 4, 5) 
results = [(date,0,1,2,3), (date,5,1,5,6), (date,3,4,4,7)] 
stock_dt = np.dtype([('date', object), 
        ('open', np.int8), 
        ('high', np.int8), 
        ('low', np.int8), 
        ('close', np.int8)]) 

d = np.array(results, dtype=stock_dt) 
matches = [] 
for item in d: 
    if item['high'] == 1: 
     matches.append(item) 

rec = np.array(matches, dtype=stock_dt) 

print rec 

回答

2

问题是matches不是元组列表,所以你不能创建一个结构化数组。相反,它是一个结构化数组列表,需要将它们合并到一个结构化数组中。您可以使用numpy.lib.recfunctions.stack_arrays此:

In [21]: import numpy.lib.recfunctions as rfn 

In [22]: rfn.stack_arrays(matches,usemask=False) 
Out[22]: 
array([(datetime.date(2013, 4, 5), 0, 1, 2, 3), 
     (datetime.date(2013, 4, 5), 5, 1, 5, 6)], 
     dtype=[('date', 'O'), ('open', 'i1'), ('high', 'i1'), ('low', 'i1'), ('close', 'i1')]) 

你也可以考虑废除完全循环:

In [23]: d[d['high'] == 1] 
Out[23]: 
array([(datetime.date(2013, 4, 5), 0, 1, 2, 3), 
     (datetime.date(2013, 4, 5), 5, 1, 5, 6)], 
     dtype=[('date', 'O'), ('open', 'i1'), ('high', 'i1'), ('low', 'i1'), ('close', 'i1')]) 

这应该是更快的,要引导。

+0

如何使用第二个答案使用多个参数? – Wallace 2013-03-28 02:45:02

+0

'd [d ['high'] == 1]'正在做的是使用'd ['high'] == 1'创建的布尔列表对数组'd'进行索引。要使用多个标准,可以使用'&'和'|'运算符,如'd [(d ['high'] == 1)&(d ['low'] == 2)]''。小心使这些过于复杂,因为它可能很快就无法读取。 – 2013-03-28 02:54:43

+0

完美!谢谢你的帮助!! – Wallace 2013-03-28 02:59:26

1

变化

rec = np.array(matches, dtype=stock_dt) 

rec = np.array(matches) 

当你遍历matches你不处理的元组了,所以你不应该再次通过dtype=stock_dtnp.array

+0

我还是一样错误 – Wallace 2013-03-28 02:38:39

相关问题