Вы можете использовать специальные методы __getitem__
и __setitem__
и создать новый класс, как показано на рисунке.
Сохраните карту индекса как словарь в переменной экземпляра self.index_map
.
import numpy as np
class Matrix(np.matrix):
def __init__(self, lis):
self.matrix = np.matrix(lis)
self.index_map = {}
def setIndexMap(self, index_map):
self.index_map = index_map
def getIndex(self, key):
if type(key) is slice:
return key
elif key not in self.index_map.keys():
return key
else:
return self.index_map[key]
def __getitem__(self, idx):
return self.matrix[self.getIndex(idx[0]), self.getIndex(idx[1])]
def __setitem__(self, idx, value):
self.matrix[self.getIndex(idx[0]), self.getIndex(idx[1])] = value
Использование:
Создание матрицы.
>>> mx = Matrix([[5,6,2],[3,3,7],[0,1,6]])
>>> mx
Matrix([[5, 6, 2],
[3, 3, 7],
[0, 1, 6]])
Определение индексной карты.
>>> mx.setIndexMap({10:0, 'A':1, 'B':2})
Различные способы индексирования матрицы.
>>> mx[0,0]
5
>>> mx[10,10]
5
>>> mx[10,'A']
6
Он также обрабатывает нарезки, как показано на рисунке.
>>> mx[1:3, 1:3]
matrix([[3, 7],
[1, 6]])