如何在python中为nd数组或矩阵设置属性设置器?

时间:2018-10-22 05:34:57

标签: python-3.x properties

我不确定如何以以下语法方式而不是复杂的解决方法来设置nd数组/矩阵。任何帮助表示赞赏。谢谢

例如:

import numpy as np

class myExample:
    def __init__(self):
        self._matrix = np.empty([2,2])

    @property
    def matrix(self, row_id=None, col_id=None):
        if row_id == None or col_id == None:
            return self._matrix
        else:
            return self._matrix[row_id, col_id]

    @matrix.setter
    def matrix(self, row_id, col_id, new_val):
        print("{}{}".format(row_id, col_id)
        self._matrix[row_id, col_id] = new_val

Test = myExample()
Test.matrix[1,2] = 3

1 个答案:

答案 0 :(得分:1)

为什么不inherit from np.array

import numpy as np

class myExample(np.ndarray):
    def __new__(cls):
        zero = np.zeros((2, 4), dtype=np.int)
        obj = np.asarray(zero).view(cls)
        return obj

Test = myExample()
Test[1,2] = 3
print(Test)

通过这种方式,您可以免费获得吸气剂和吸气剂(__getitem__ / __setitem__)。

(请注意,索引[1, 2]超出了形状[2, 2]的范围)。


,如果您只有getter,那么您的示例实际上可以工作;您返回已经具有所需属性的np.array

import numpy as np

class myExample:
    def __init__(self):
        self._matrix = np.empty([3, 4])

    @property
    def matrix(self):
        return self._matrix


Test = myExample()
Test.matrix[1,2] = 3

在OP评论后更新:如果您需要在设置项目之前打印矩阵(或执行其他操作),则可以尝试以下操作:

import numpy as np

class myExample:
    def __init__(self):
        self._matrix = np.zeros([3, 4])

    @property
    def matrix(self):
        return self._matrix

    def __setitem__(self, key, value):
        print(self._matrix)  # or other things...
        self._matrix[key] = value

Test = myExample()
Test[1, 3] = 5