无法使用矩阵元素创建对象

时间:2018-12-17 00:15:06

标签: python numpy

我在python2.7上,我想在将所有坐标初始化为0之后从矩阵中的特定坐标获取对象:

import numpy as np

class test:
    "it's a test"
    def __init__(self):
        self.x=4
        self.y=5

mat=np.full(shape=(4,4),fill_value=0)

mat[2,2]=test()
print(mat[2,2].x)
print(mat[2,2].y)

但是我有这个错误:

Traceback (most recent call last):
 File "/root/Documents/matrix.py", line 11, in <module>
  mat[2,2]=test()
AttributeError: test instance has no attribute '__trunc__'enter code here

如果我将第9行更改为:

    `mat=np.zeros(shape=(4,4))

我收到此错误:

Traceback (most recent call last):
 File "/root/Documents/matrix.py", line 11, in <module>
  mat[2]=test()
AttributeError: test instance has no attribute '__float__'

对于简单列表中的元素而言,它可以正常工作,所以我希望这不是由于我将numpy与Matrix一起使用...

我希望有人能帮助我,谢谢!

2 个答案:

答案 0 :(得分:0)

您应该明确说明数据类型是对象

mat=np.full(shape=(4,4),fill_value=0, dtype=object)

答案 1 :(得分:0)

请注意您的语句创建的内容。

In [164]: mat=np.full(shape=(4,4),fill_value=0)
In [165]: 
In [165]: mat
Out[165]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
In [166]: mat.dtype
Out[166]: dtype('int64')

此数组只能容纳整数。该错误意味着它将尝试将__trunc__方法应用于您的对象。这将适用于像12.23.__trunc__()这样的数字。但是您尚未定义这种方法。

In [167]: mat=np.zeros(shape=(4,4))

In [168]: mat
Out[168]: 
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
In [169]: mat.dtype
Out[169]: dtype('float64')

这里dtype是float。同样,您尚未定义__float__方法。

一个列表包含指向Python对象的指针。

In [171]: class test:
     ...:     "it's a test"
     ...:     def __init__(self):
     ...:         self.x=4
     ...:         self.y=5
     ...:     def __repr__(self):
     ...:         return 'test x={},y={}'.format(self.x, self.y)
     ...:     
In [172]: alist = [test(), test()]
In [173]: alist
Out[173]: [test x=4,y=5, test x=4,y=5]

我们可以创建一个数组来保存您的对象:

In [174]: arr = np.array(alist)
In [175]: arr
Out[175]: array([test x=4,y=5, test x=4,y=5], dtype=object)
In [176]: arr[0].x
Out[176]: 4

但是请注意dtype

对象dtype数组类似于列表,具有一些数组属性。可以调整它们的形状,但是大多数操作必须使用某种列表迭代。数学取决于您定义的方法。

除非确实需要,否则不要使用对象dtype数组。列表更易于使用。