我试图用NumPy创建一个n乘n的对象数组,这里有我的问题:假设数组的维数被设置为m=n=3
。对于每个元素,我想为我的类Vector
分配一个实例,这是一个n维向量类型。在
在我的第一次尝试中,我试图分配一个2维。按以下方式矢量:
array_size = 4
np.array([
[ Vector(1,2) for j in xrange(array_size) ]
for i in xrange(array_size) ], dtype=object)
Python返回的不是Vector
实例数组:
上面是一个形状(3, 3, 2)
的数组,而不是(2, 2)
的数组。Numpy将Vector
实例转换为第三个数组维度。这不是我想要的,所以我试了另一件事:
我首先定义了一个空对象数组,然后将实例分配给它:
array_size=3
mx = np.empty([array_size, array_size], dtype=object).astype(list)
for i in xrange(array_size):
for j in xrange(array_size):
mx[i][j] = Vector(1,2)
有趣的是,我必须将数组转换为一个列表。然后它运行得很好,并返回我所需要的:
[[< Vector: [1, 2] > < Vector: [1, 2] > < Vector: [1, 2] >]
[< Vector: [1, 2] > < Vector: [1, 2] > < Vector: [1, 2] >]
[< Vector: [1, 2] > < Vector: [1, 2] > < Vector: [1, 2] >]]
然后可以将列表强制转换回数组。所以,数组可以(!)按我想要的方式拿东西。但似乎没有直接的方法来分配实例。还有,难道没有比Python更厉害的吗?我真的想摆脱这个嵌套循环。在
我还尝试了np.nditer
:
array_size=3
mx = np.empty([array_size, array_size], dtype=object)
for i in np.nditer(mx, flags=["refs_ok"], op_flags=["writeonly"]):
i[...] = Vector(1, 2)
它不是数组,而是返回一个错误:
ValueError: assignment to 0-d array
我不明白。在
关于嵌套循环,有人有好的解决方案吗?也欢迎解释数值错误。在
如果不将强制转换为列表,并且如果您执行如下赋值,则循环应该有效:
在您的第一次尝试中,
np.array
只是在做它的工作。它看到一个嵌套的数据集合,可以转换为三维数组,所以它这样做了。在要获取对象的二维数组,可以更改:
^{pr2}$为此:
下面是一个具体的例子:
我没有你的
Vector
类,所以我只使用numpy数组作为对象数组中的对象。在下面是我要放入对象数组中的数据。它是numpy数组的嵌套列表,每个数组都有两个元素:
您可以将
np.array([10*j + k, 10*j + k + 1])
更改为Vector(10*j + k, 10*j + k + 1)
,以便在您的Vector
类中尝试此操作。在a
是我正在创建的对象数组:将向量分配给
a
,如下所示:相关问题 更多 >
编程相关推荐