Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用NumPy创建n×n实例数组_Python_Arrays_Object_Numpy - Fatal编程技术网

Python 使用NumPy创建n×n实例数组

Python 使用NumPy创建n×n实例数组,python,arrays,object,numpy,Python,Arrays,Object,Numpy,我试图用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) ],

我试图用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将
向量
实例转换为第三个数组维度。这不是我想要的,所以我尝试了另一件事:

我首先定义了一个空对象数组,然后将实例分配给它:

    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] >]]
此数组不是数组,而是返回一个错误:

ValueError:分配给0-d数组

我不明白


关于嵌套循环,有人有好的解决方案吗?还欢迎对值错误进行解释。

如果您不强制转换到列表,并且执行以下赋值操作,则循环应该可以工作:

        mx[i,j] = Vector(1,2)

在您的第一次尝试中,
np.array
正在完成它的工作。它可以看到一个嵌套的数据集合,这些数据可以转换为三维数组,因此它可以这样做

要获取二维对象数组,可以更改以下内容:

a = np.array(<nested list of Vectors>, dtype=object)  # Doesn't work as desired.
您可以将
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)

所以最大的问题是为什么你有自己的
Vector
类?(num)python方法是对所有内容使用numpy数组类(正如示例代码中的
array
构造函数返回的那样),根据需要进行重塑和切片。
Vector
继承自
np.ndarray
,并提供了向量代数功能的一些简化和扩展。因此,最大的问题是:“为什么即使我使用纯
ndarray
而不是
Vectors
,它也不起作用?”我认为第一次尝试可能会失败,因为Vector是ndarray,所以您的实例将具有数组接口(请参阅)。也许可以将向量类更改为具有ndarray属性,而不是ndarray子类。回答得好。谢谢你,我试过了,成功了。出于某种原因,我的嵌套For循环比您的代码快12%(1000 x 1000个3d向量数组)似乎我不得不接受循环;-)
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])]]
In [28]: a = np.empty((3, 3), dtype=object)
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)