gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:58:22 28 4
gpt4 key购买 nike

我有一个返回数组的 Python 对象的属性。现在,我可以设置该属性的 setter ,使整个数组都可设置。但是,我缺少如何通过属性自行设置元素。

我希望从用户的角度来看(给定一个空的 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 数组。

但是,如果我将 return self._a 替换为 NumPy 函数(以矢量化方式遍历元素)并替换 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 的正确实现以使数组的单个元素可单独写入访问并因此也可设置?

非常感谢您的提示和帮助,XMA

@Jaime 在他的回答下方提出的观点对我帮助很大!谢谢!

最佳答案

由于数组是可变对象,因此即使没有 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 的子类或包装它的一个实例。无论哪种方式,都会有很多不平凡的工作。

关于python - 如何使 NumPy 数组属性的元素可设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890393/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com