使用 class 对象设置 Numpy 数组元素

setting Numpy array elements with a class object

我创建了一个名为 Tensor

的 class
import numpy as np

class Tensor:
    def __init__(self, data):
        self.data = np.array(data)

我想使用 Tensor:

设置 numpy 数组的元素
x = np.array([[1,2,3,4],[4,3,2,1]])
x[:,::2] = Tensor([[0,0],[1,1]])

但它导致错误 ValueError: setting an array element with a sequence.

一种解决方法是检索 Tensor 的数据属性:x[:,::2] = Tensor([[0,0],[1,1]]).data,但我想知道如何在不手动检索任何内容的情况下执行此操作,例如当您可以使用列表或 numpy 数组设置值时:x[:,::2] = [[0,0],[1,1]]x[:,::2] = np.array([[0,0],[1,1]])

Numpy数组对象都遵循一个协议,只要实现了__array__方法,就可以把对象当作数组使用:

>>> class Tensor:
...     def __init__(self, data):
...         self.data = np.array(data)
...     def __array__(self, dtype=None):
...         return self.data    # self.data.astype(dtype, copy=False) maybe better
...
>>> x[:,::2] = Tensor([[0,0],[1,1]])
>>> x
array([[0, 2, 0, 4],
       [1, 3, 1, 1]])

参考:Writing custom array containers