Как установить свойства для nd-массива или матрицы в Python? - PullRequest
0 голосов
/ 22 октября 2018

Я не уверен, как мне добиться установки 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 голосов
/ 22 октября 2018

почему бы не наследовать от 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

обновить после комментариев ОП: если вам нужно распечатать матрицу (или сделать что-то другое) перед установкой элементов, которые вы можете попробоватьэто:

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
...