python - 如何将实例属性链接到 numpy 数组?

标签 python numpy

我有一个 Python 对象列表,代表几个类。这些类显然不同,但仍然有一些共同的属性(每个对象具有不同的值)。例如:

class Super1:
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2
        #Lot's of other stuff

class Sub1(Super1):
    def __init__(self, value1, value2, value3):
        Super1.__init__(self, value1, value2)
        self.value3 = value3
        #Lot's of stuff

class Sub2(Super1):
    def __init__(self, value1, value2, value4):
        Super1.__init__(self, value1, value2)
        self.value4 = value4
        #Lot's of stuff

objects = [Sub1(1.,2.,3.), Sub1(213.,2.,23.), Sub2(23.,10.,0.2), Sub1(3.,2.,12.)]

现在,为了方便和性能,我需要一个包含所有这些值的 NumPy 数组。我知道我可以这样阅读它们:

np.array([objects[ii].value1 for ii in range(4)])

但我还需要以数组形式以及在实例方法中单独更改值。是否有可能通过使用指针或其他方式以某种方式动态链接对象属性和数组中的相应值?

不,这里的对象不一定是列表。欢迎提出建议。

最佳答案

Numpy 数组是 "a contiguous one-dimensional segment of computer memory" , 所以你真的没有办法创建一个由内存块组成的 numpy 数组。

唯一的可能性是反过来,首先创建数组,然后将该数组的单个元素切片分配给您的对象,例如

class Super1(object):
    def __init__(self, value1):
        self._value1 = value1

    @property
    def value1(self):
        return self._value1[0]

    @value1.setter
    def value1(self, value):
        self._value1[0] = value

现在:

>>> a = np.arange(4)
>>> obj = [Super1(a[j:j+1]) for j in xrange(len(a))]
>>> obj[0].value1
0
>>> obj[0].value1 = 5
>>> a
array([5, 1, 2, 3])
>>> obj[2].value1
2
>>> a[2] = 8
>>> obj[2].value1
8

关于python - 如何将实例属性链接到 numpy 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928038/

相关文章:

python - 通过二值图像 Numpy 矩阵的矩阵运算计算均方误差

python - Numpy 索引数组插入

python - 排除位置以在 python 中创建新间隔

python - 以表单传递数据库值(django)

python - 在 Windows 中处理 unicode 字符串

python:xlsxwriter将数据框+公式添加到excel文件

python - sqlalchemy 查询与sqlite 的一对多关系

python - 编译 Mozilla Firefox 时创建 ./config.data 失败

python - 如何在Python中生成一个范围内但偏向于某些特定数字的随机数?

python - 在 Python 中计算累积分布函数 (CDF)