如何使NumPy数组属性的元素可设置?

vcudknz3  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个返回数组的Python对象的属性,现在,我可以设置该属性的setter,这样整个数组都是可设置的,但是,我不知道如何通过该属性使元素本身是可设置的。
从用户的Angular 来看(给定一个空的SomeClass类):

>>> x = SomeClass()
>>> x.array = [1, 2, 3]
>>> x.array[1] = 4
>>> print (x.array)
[1, 4, 3]

现在,假设SomeClass.array是一个属性,定义为

class SomeClass(object):
    def __init__(self, a):
        self._a = a

    @property
    def array(self):
        return self._a
    @array.setter
    def array(self, a):
        self._a = a

所有的东西仍然和上面一样工作。如果我在setter上强制使用简单的NumPy数组。
然而,如果我用NumPy函数(以矢量化的方式通过元素)替换return self._a,并用反函数替换self._a = a,当然条目不会再被设置。
示例:

import numpy as np

class SomeClass(object):
    def __init__(self, a):
        self._a = np.array(a)

    @property
    def array(self):
        return np.sqrt(self._a)
    @array.setter
    def array(self, a):
        self._a = np.power(a, 2)

现在,用户将看到以下输出:

>>> x = SomeClass([1, 4, 9])
>>> print (x.array)
array([1., 2., 3.])
>>> x.array[1] = 13
>>> print (x.array)    # would expect an array([1., 13., 3.]) now!
array([1., 2., 3.])

我想我明白问题出在哪里了(NumPy在操作过程中创建的数组的元素发生了变化,但对存储的数组没有影响)。
SomeClass的正确实现是什么,可以使数组的单个元素可以单独写访问,从而也可以设置?
非常感谢你的提示和帮助,TheXMA
Jaime在他的回答下面所做的几点对我帮助很大!谢谢!

rdlzhqv9

rdlzhqv91#

由于数组是可变对象,因此即使没有setter函数,单个项也是可设置的:

>>> class A(object):
...     def __init__(self, a):
...         self._a = np.asarray(a)
...     @property
...     def arr(self):
...         return self._a
...
>>> a = A([1,2,3])

>>> a.arr
array([1, 2, 3])

>>> a.arr = [4,5,6] # There is no setter...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

>>> a.arr[1] = 7 # ...but the array is mutable
>>> a.arr
array([1, 7, 3])

这是元组与列表的一种用法,因为后者是可变的,而前者不是。无论如何,回答你的问题:只要getter返回对象本身,就可以很容易地设置单个项。
第二个示例中的更好的性能似乎不容易通过任何简单的方式获得。我认为您可以通过将SomeClass.array属性设置为定制类来实现这一点。定制类可以是ndarray的子类,也可以是它的一个示例。无论哪种方式,都需要大量的工作。

相关问题