我正在尝试使用现有数组的元素创建一个新数组。我一直得到:ValueError:使用缓冲区设置带对象成员的void-array。
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
答案 0 :(得分:4)
问题是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')])
哪个应该更快,才能启动。
答案 1 :(得分:1)
更改
rec = np.array(matches, dtype=stock_dt)
到
rec = np.array(matches)
当您在matches
上进行迭代时,您不再处理元组,因此您不应再次将dtype=stock_dt
传递给np.array
。