Не удается создать объект с элементом матрицы - PullRequest
0 голосов
/ 17 декабря 2018

Я нахожусь на 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 ...

Надеюсь, кто-то может мне помочь, спасибо!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Обратите внимание на то, что создают ваши операторы.

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, если они вам действительно не нужны.Списки проще в использовании.

0 голосов
/ 17 декабря 2018

Вы должны сделать явным тот факт, что типом данных являются объекты

mat=np.full(shape=(4,4),fill_value=0, dtype=object)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...