Numpy переиндексирует первые N натуральных чисел - PullRequest
0 голосов
/ 28 июня 2018

У меня есть матрица с довольно разреженным индексом (самые большие значения в строках и столбцах превышают 130000), но только некоторые из этих строк / столбцов на самом деле имеют ненулевые значения.

Таким образом, я хочу, чтобы индексы строк и столбцов были смещены, чтобы представлять только ненулевые индексы первыми N натуральными числами.

Визуально, я хочу пример такой матрицы

1 0 1
0 0 0
0 0 1

чтобы выглядеть так

1 1
0 1

но только если все значения в строке / столбце равны нулю. Поскольку у меня есть матрица в разреженном формате, я мог бы просто создать словарь, сохранить каждое значение с помощью увеличивающегося счетчика (для строки и матрицы отдельно) и получить результат.

row_dict = {}
col_dict = {}
row_ind = 0
col_ind = 0

# el looks like this: (row, column, value)
for el in sparse_matrix:
    if el[0] not in row_dict.keys():
        row_dict[el[0]] = row_ind
        row_ind += 1
    if el[1] not in col_dict.keys():
        col_dict[el[1]] = col_ind
        col_ind += 1
# now recreate matrix with new index

Но я искал, возможно, внутреннюю функцию в NumPy. Также обратите внимание, что я действительно не знаю, как сформулировать вопрос, поэтому вполне может быть дубликат, о котором я не знаю; Любые указатели в правильном направлении приветствуются.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать np.unique:

>>> import numpy as np 
>>> from scipy import sparse
>>>
>>> A = np.random.randint(-100, 10, (10, 10)).clip(0, None)
>>> A
array([[6, 0, 5, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 7, 0, 0, 0, 0, 4, 9],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 4, 0],
       [9, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 4, 0, 0, 0, 0, 0, 0]])
>>> B = sparse.coo_matrix(A)
>>> B
<10x10 sparse matrix of type '<class 'numpy.int64'>'
        with 8 stored elements in COOrdinate format>
>>> runq, ridx = np.unique(B.row, return_inverse=True)
>>> cunq, cidx = np.unique(B.col, return_inverse=True)
>>> C = sparse.coo_matrix((B.data, (ridx, cidx)))
>>> C.A
array([[6, 5, 0, 0, 0],
       [0, 0, 7, 4, 9],
       [0, 0, 0, 4, 0],
       [9, 0, 0, 0, 0],
       [0, 0, 4, 0, 0]])
...