Python 数组上的Numpy迭代器未按预期工作

Python 数组上的Numpy迭代器未按预期工作,python,numpy,iterator,Python,Numpy,Iterator,我想声明一个对象数组,然后在其中包含数组。我可以这样做: import numpy as np v = np.empty([2,2], dtype=object) for i in range(len(v.flat)): v.flat[i] = np.ones([3]) 但由于Numpy有迭代器,我想使用它们: v = np.empty([2,2], dtype=object) for i in np.nditer(v, flags=['refs_ok'],op_flags=['r

我想声明一个对象数组,然后在其中包含数组。我可以这样做:

import numpy as np    
v = np.empty([2,2], dtype=object)
for i in range(len(v.flat)):
  v.flat[i] = np.ones([3])
但由于Numpy有迭代器,我想使用它们:

v = np.empty([2,2], dtype=object)
for i in np.nditer(v, flags=['refs_ok'],op_flags=['readwrite']):
  i[...] = np.ones([3])
信息是:

ValueError: could not broadcast input array from shape (3) into shape()
有人能解释一下我如何正确地做这件事吗


TIA

我不知道它是否正是您正在寻找的,但要使用numpy迭代器获得相同的结果,以下代码可能是您的答案

v = np.empty([2,2], dtype=object)

for idRow,idCol in np.ndindex(np.shape(v)):
    v[idRow,idCol] = np.ones(3)
    print idRow, idCol

如果它不是您想要的,请根据您的要求更加具体,以下是我喜欢的解决方案:

老实说,我不确定这是否更有意义(我会这么说) 可能有道理)。但是您可以使用
i[()]=…
,因为您想这样做 无论如何,不要进行基于视图/切片的项目分配

哦,小心那些东西我忘了陷阱是什么了 是的,但我很确定缓冲区和 参考计数


github的seberg

似乎numpy在分配中检测到一个iterable,并试图广播它。我自己也不知道该怎么做,但是
I.fill(numpy.ones([3]))
似乎可以正常工作。感谢您的解决方案。现在,如果有人能解释为什么
i[…]=
是错误的,或者我是否应该做一个“bug”报告。@Olric,这只是“错误”的意思,即当作业右侧的参数不可接受时,numpy会尝试广播。这种类型的行为通常是可取的(例如,
v[0,:2]=1,2
),因此我不认为这是一个bug。numpy开发团队最近一直在讨论对象数组的创建。如果您有一个github帐户,将此作为问题报告将非常受欢迎。此解决方案与我的第一个示例相同。它可以工作,但我想使用Numpy的迭代器(我希望它们更快)。我还想了解为什么它不起作用:-)我认为您希望得到与第一个示例相同的结果。我使用了numpy迭代器,所以我真的不知道你想要什么。第二个不起作用,因为你不能给“i”赋值。即使
ndindex
文档说你是对的,我也不会把它称为迭代器。对我来说,迭代器是一个对象,它是数组的单元格,而不是它的索引
nditer
是我所说的迭代器,列表中I的常规
是迭代器,而不是范围(len(list))中I的
。现在我可能错了。我使用您的range和nditer案例(以及更大的阵列)运行了一些快速测试。nditer方法速度稍快,但可能不足以证明不确定性。