python - 尝试创建数组时继续使用 numpy 获取 ValueError

标签 python 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

最佳答案

问题是 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')])

启动速度应该更快。

关于python - 尝试创建数组时继续使用 numpy 获取 ValueError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673155/

相关文章:

python - 如何抓取付费专区后面的网站

python - 在 Python 中以字符串格式对日期列表进行排序的最有效方法是什么?

Python - 查找一个矩阵的每一行中的 K 个最大值并与二进制矩阵进行比较

python - 如何根据python中的阈值从数组中提取子数组?

python - 主窗口小部件调整大小(Pyside)

python - 值错误 :Setting an array element with a sequence using numpy

Python:循环遍历 if 语句的 elif 部分

python - python 中的动态数组和速度 - 增长数组的最快方法

python - 以矩阵形式将列表排列到numpy数组

python-3.x - 如何检查 Pandas 行是否包含列表的任何完整字符串或子字符串?