Индекс карты матрицы - PullRequest
       7

Индекс карты матрицы

0 голосов
/ 26 октября 2018

Как я должен отображать индексы матрицы NumPy?

Например:

mx = np.matrix([[5,6,2],[3,3,7],[0,1,6]]

Индексы строки / столбца равны 0, 1, 2.

Итак:

>>> mx[0,0]
5

Скажем, мне нужно отобразить эти индексы, преобразовав 0, 1, 2 в, например, 10, 'A', 'B' таким образом, что:

mx[10,10] #returns 5
mx[10,'A'] #returns 6 and so on..

Я могу просто установить dict и использовать его для доступа к элементам, но я хотел бы знать, возможно ли сделать что-то подобное тому, что я только что описал.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Я бы предложил использовать pandas dataframe с индексом и столбцами, используя новое отображение для индексации строк и столбцов соответственно для простоты индексации.Это позволяет нам выбирать отдельный элемент или целую строку или столбец с помощью знакомого оператора colon.

Рассмотрим универсальный (неквадратная матрица в форме 4x3) -

mx = np.matrix([[5,6,2],[3,3,7],[0,1,6],[4,5,2]])

Рассмотримсопоставления для строк и столбцов -

row_idx = [10, 'A', 'B','C']
col_idx = [10, 'A', 'B']

Давайте рассмотрим рабочий процесс с данным примером -

# Get data into dataframe with given mappings
In [57]: import pandas as pd

In [58]: df = pd.DataFrame(mx,index=row_idx, columns=col_idx)

# Here's how dataframe data looks like
In [60]: df
Out[60]: 
    10  A  B
10   5  6  2
A    3  3  7
B    0  1  6
C    4  5  2

# Get one scalar element
In [61]: df.loc['C',10]
Out[61]: 4

# Get one entire col
In [63]: df.loc[:,10].values
Out[63]: array([5, 3, 0, 4])

# Get one entire row
In [65]: df.loc['A'].values
Out[65]: array([3, 3, 7])

И, что лучше всего, мы не делаем никаких дополнительных копий, так каккадр данных и его фрагменты все еще индексируются в пространство памяти исходной матрицы / массива -

In [98]: np.shares_memory(mx,df.loc[:,10].values)
Out[98]: True
0 голосов
/ 26 октября 2018

Вы можете использовать специальные методы __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]])
0 голосов
/ 26 октября 2018

Попробуйте это:

import numpy as np
A = np.array(((1,2),(3,4),(50,100)))
dt = np.dtype([('ID', np.int32), ('Ring', np.int32)])
B = np.array(list(map(tuple, A)), dtype=dt)
print(B['ID'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...