Python np.nditer()-ValueError:操作数太多

Python np.nditer()-ValueError:操作数太多,python,numpy,Python,Numpy,我有几种方法可以将不同数量的杂乱数据传递到此函数,以将标题与数据结合起来并返回字典列表: def zip_data(self, indicator_names, indicator_values): values = [[float(elem) for elem in item] for item in np.nditer(indicator_values)] return [dict(zip(indicator_names, row)) for row in values]

我有几种方法可以将不同数量的杂乱数据传递到此函数,以将标题与数据结合起来并返回字典列表:

def zip_data(self, indicator_names, indicator_values):
    values = [[float(elem) for elem in item] for item in np.nditer(indicator_values)]
    return [dict(zip(indicator_names, row)) for row in values]
基本上是这样的(他们也这么做):

问题是,如果传递了一个包含20个元素的列表,它会非常有效,但对于类似40个元素,它会给出错误:

文件“xy.py”,第205行,在动量指示器中 返回self.zip\大\数据(动量\指标\名称、动量\指标\值)

文件“xy.py”,第51行,在zip\u大数据中 对于np.nditer中的项目(指标值):

ValueError:操作数太多

np.nditer()可以迭代多少个值?有没有办法避免这种情况

编辑 小例子:

指标_值=[数组([1,2,3,4,5]),数组([5,10,15,20, 25])]

指标名称=['a','b']

想要的输出:

数据=[{'a':1,'b':5},{'a':2,'b':10},{'a':3,'b':15},{'a': 4,'b':20},{'a':5,'b':25}]

当前状态:

def zip_large_data(self, indicator_names, indicator_values):
    data = []
    print(indicator_values[0])
    for item in np.nditer(indicator_values):
        print(item)
        values = []
        values.append(int(item[0]))
        for elem in item[1:]:
            values.append(float(elem))
        data.append(dict(zip(indicator_names, values)))
        print(data)
        break
    return data
输出:

输入:打印(指示符值[0])

输出:[1 2 3 4 5]

输入:打印(项目)

输出:(数组(1),数组(5))

输入:打印(数据)

Out:[{'a':1,'b':5}]

所以基本上我不想依次遍历指示符值,而是每个数组的第一个元素,然后每个数组的第二个元素等等。。我想避免nditer,但不知道怎么做


抱歉,英语不是我的第一语言,第一次使用numpy时,它让人困惑。

你达到了
NPY\u MAXARGS
的极限

我还没有见过像这样使用
nditer
,所以我花了一点时间才弄清楚到底发生了什么。然后我不得不使用python会话来测试我的想法。一个成功的例子会有所帮助

海报通常使用
nditer
作为一种简单地遍历数组并进行一些计算的方法。简单的迭代(没有
nditer)通常更快。
nditer
主要是朝着实现
cython`中的想法迈出的一步

使用数组列表,
nditer
将它们一起广播,然后遍历匹配的元素。它类似于常见的pythonlistzip习惯用法(由函数名暗示)

定义3个可相互广播的小阵列:

In [136]: a = np.array([[1,2],[3,4]])
In [137]: b = np.array([[4],[5]])
In [138]: c = np.array([10])
In [140]: np.broadcast_arrays(a,b,c)
Out[140]: 
[array([[1, 2],
        [3, 4]]), array([[4, 4],
        [5, 5]]), array([[10, 10],
        [10, 10]])]
使用
nditer

In [143]: for x in np.nditer([a,b,c]):
     ...:     print(x)
     ...:     
(array(1), array(4), array(10))
(array(2), array(4), array(10))
(array(3), array(5), array(10))
(array(4), array(5), array(10))
根据您的功能:

In [155]: zip_large_data('abc',[a,b,c])
Out[155]: 
[{'a': 1, 'b': 4.0, 'c': 10.0},
 {'a': 2, 'b': 4.0, 'c': 10.0},
 {'a': 3, 'b': 5.0, 'c': 10.0},
 {'a': 4, 'b': 5.0, 'c': 10.0}]
如果我用32个操作数进行同样的迭代,如果运行正常,但用33个操作数失败

In [160]: for x in np.nditer([a,b,c]*11):
     ...:     pass 

ValueError: Too many operands
numpy
具有32个操作数限制(和32维限制)。它没有很好的文档记录,也不经常出现。我只在使用
np的问题中见过它。选择


为什么要使用
nditer
?告诉我们有关指标值的信息。数据类型?shape?由于numpy数组的缘故,使用nditer,还有其他方法可以迭代吗?指示符值是numpy数组的列表。。indicator_names是指定给numpy数组的每个元素的预定义头的列表。nditer在numpy C-api中比python更有用。你可以直接迭代数组的第一个维度。nditer的完整文档-你需要提供一个小的工作示例。我怀疑您使用nditer的方式是不寻常的,也是无意的。感谢您注意到它只支持32个操作数,还需要找到一种方法来迭代更多操作数:I您需要广播吗?还是数组总是1d(和相同长度)?数组总是1d和相同长度是用
zip(*indicator_values)
替换
nditer
有效吗?谢谢你的努力和耐心,你刚刚救了我。
In [155]: zip_large_data('abc',[a,b,c])
Out[155]: 
[{'a': 1, 'b': 4.0, 'c': 10.0},
 {'a': 2, 'b': 4.0, 'c': 10.0},
 {'a': 3, 'b': 5.0, 'c': 10.0},
 {'a': 4, 'b': 5.0, 'c': 10.0}]
In [160]: for x in np.nditer([a,b,c]*11):
     ...:     pass 

ValueError: Too many operands