我试图用NumPy创建一个n个n对象的数组,这是我的问题:让我们假设数组的维度设置为m=n=3
。我希望为每个元素分配一个类Vector
的实例,它是一个n维向量类型。
在我的第一次尝试中,我试图指定一个2-dim。矢量按以下方式:
array_size = 4
np.array([
[ Vector(1,2) for j in xrange(array_size) ]
for i in xrange(array_size) ], dtype=object)
而不是Python返回的Vector
个实例数组:
[[[1 2]
[1 2]
[1 2]]
[[1 2]
[1 2]
[1 2]]
[[1 2]
[1 2]
[1 2]]]
上面是一个形状(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] >]]
然后可以将列表转换回数组。因此,数组可以(!)以我想要的方式保存对象。但似乎没有直接的方式来分配实例。而且,是不是还有更多的pythonic呢?我真的想摆脱这个嵌套循环。
我也试过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:赋值给0-d数组
我不明白。
有没有人对嵌套循环有一个很好的解决方案?价值错误的解释也是受欢迎的。
答案 0 :(得分:2)
如果你没有强制转换为列表,你的循环应该有效,如果你做了如下任务:
mx[i,j] = Vector(1,2)
在您的第一次尝试中,np.array
正在完成其工作。它看到了一个可以转换为三维数组的嵌套数据集,因此它就是这样做的。
要获得二维对象数组,您可以更改此内容:
a = np.array(<nested list of Vectors>, dtype=object) # Doesn't work as desired.
到此:
vectors = <nested list of Vectors>
a = np.empty(<desired shape>, dtype=object)
a[...] = vectors
这是一个具体的例子:
我没有你的Vector
类,所以我只是使用numpy数组作为对象数组中我想要的对象。
这是我想要放入对象数组的数据。它是numpy数组的嵌套列表,每个数组都有两个元素:
In [26]: vectors = [[np.array([10*j + k, 10*j + k + 1]) for k in range(3)] for j in range(3)]
In [27]: vectors
Out[27]:
[[array([0, 1]), array([1, 2]), array([2, 3])],
[array([10, 11]), array([11, 12]), array([12, 13])],
[array([20, 21]), array([21, 22]), array([22, 23])]]
您可以将np.array([10*j + k, 10*j + k + 1])
更改为Vector(10*j + k, 10*j + k + 1)
,以便在Vector
课程中尝试此操作。
a
是我正在创建的对象数组:
In [28]: a = np.empty((3, 3), dtype=object)
将矢量分配给a
,如下所示:
In [29]: a[...] = vectors # or `a[:,:] = vectors`
In [30]: a
Out[30]:
array([[array([0, 1]), array([1, 2]), array([2, 3])],
[array([10, 11]), array([11, 12]), array([12, 13])],
[array([20, 21]), array([21, 22]), array([22, 23])]], dtype=object)
In [31]: a.shape
Out[31]: (3, 3)