Python 如何代替分配np.ndarray.data?

Python 如何代替分配np.ndarray.data?,python,arrays,numpy,subclassing,Python,Arrays,Numpy,Subclassing,我想将np.ndarray子类化,以便为2D点创建一个类,其中大多数Numpy机制仍然可用,并且还有一些特定于2D阵列的附加方法。其中一种方法是围绕原点旋转点。我尝试使用矩阵乘法,然后将结果的data属性指定给我的点 >>将numpy作为np导入 >>>类点2D(np.ndarray): ... 定义-新建(cls、coords): ... point=np.array(坐标,dtype=float.view)(cls) ... 如果点.shape!=(2

我想将
np.ndarray
子类化,以便为2D点创建一个类,其中大多数Numpy机制仍然可用,并且还有一些特定于2D阵列的附加方法。其中一种方法是围绕原点旋转点。我尝试使用矩阵乘法,然后将结果的
data
属性指定给我的点

>>将numpy作为np导入
>>>类点2D(np.ndarray):
...     定义-新建(cls、coords):
...         point=np.array(坐标,dtype=float.view)(cls)
...         如果点.shape!=(2,):
...             raise VALUETERROR(“点2D正好需要两个坐标。”)
...         返回点
...
...     def旋转(自身、角度):
...         self.data=(np.array([[np.cos(角度),-np.sin(角度)],
…[np.sin(角度),np.cos(角度)])@self.数据
...
>>>x=点2D((1,0))
>>>x.旋转(np.pi/2)
__主要提示:10:弃用警告:分配“数据”属性本质上是不安全的操作,将在将来删除。
弃用警告提示我不要分配
数据
属性。我应该怎么做呢?

使用

>>将numpy作为np导入
>>>类点2D(np.ndarray):
...     定义-新建(cls、coords):
...         point=np.array(坐标,dtype=float.view)(cls)
...         如果点.shape!=(2,):
...             raise VALUERROR(“一个Vec2D需要两个坐标。”)
...         返回点
...
...     def旋转(自身、角度):
...         s=np.sin(角度)
...         c=np.cos(角度)
...         np.copyto(self,np.array([[c,-s],
…[s,c]])@self)
...
>>>x=点2D((1,0))
>>>x.旋转(np.pi/2)
>>>x
点2D([6.123234e-17,1.000000e+00])

您也可以使用省略号片分配

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


其中,
:,:
的“缩写”

Numpy数组的
data
属性提供同一数组的
memoryview()
。它允许原始字节级访问阵列数据。您需要对元素进行高级访问,因此Eric的答案很好。另外,由于
memoryview
实例是一个对象,其方法允许访问数据和相应的元数据,而不是原始数据本身,分配给
。data
将(通常)将memoryview替换为完全不同的内容,而不仅仅是写入数据,因此在任何可能的实际情况下都不可取,因此会发出警告。实际上,对于常规Numpy数组,分配给
。data
不会用其他内容替换memoryview,因为Numpy包代码具有“魔力”在执行任务时。但它仍然会影响除原始数据之外的其他内容,因此阵列今后可能会出现意外行为。这也不是访问
数据的好方法。这对你的特殊情况并不重要。只是澄清我之前的评论。