Что делать вместо назначения np.ndarray.data? - PullRequest
0 голосов
/ 27 марта 2020

Я хочу создать подкласс np.ndarray, чтобы создать класс для 2D-точек с большей частью доступного оборудования Numpy и некоторыми дополнительными методами, определяющими c для 2D-массивов. Одним из таких методов является вращение точки вокруг начала координат. Я попытался сделать это, используя умножение матриц, а затем присвоив моей точке атрибут data результата.

>>> import numpy as np
>>> class Point2D(np.ndarray):
...     def __new__(cls, coords):
...         point = np.array(coords, dtype=float).view(cls)
...         if point.shape != (2,):
...             raise ValueError("A Point2D needs exactly two coordinates.")
...         return point
...
...     def rotate(self, angle):
...         self.data = (np.array([[np.cos(angle), -np.sin(angle)],
...                                [np.sin(angle),  np.cos(angle)]]) @ self).data
...
>>> x = Point2D((1, 0))
>>> x.rotate(np.pi/2)
__main__:10: DeprecationWarning: Assigning the 'data' attribute is an inherently unsafe operation and will be removed in the future.

Предупреждение об устаревании побуждает меня не назначать атрибут data. Что мне делать вместо этого?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Вы также можете использовать назначение среза эллипса,

self[...] = np.array([[c, -s],
                      [s,  c]]) @ self)

Где здесь ... является "коротким" для :, :.

0 голосов
/ 31 марта 2020

Использование np.copyto.

>>> import numpy as np
>>> class Point2D(np.ndarray):
...     def __new__(cls, coords):
...         point = np.array(coords, dtype=float).view(cls)
...         if point.shape != (2,):
...             raise ValueError("A Vec2D needs exactly two coordinates.")
...         return point
...
...     def rotate(self, angle):
...         s = np.sin(angle)
...         c = np.cos(angle)
...         np.copyto(self, np.array([[c, -s],
...                                   [s,  c]]) @ self)
...
>>> x = Point2D((1, 0))
>>> x.rotate(np.pi/2)
>>> x
Point2D([6.123234e-17, 1.000000e+00])
...