главная колонка и основная строка столбца - PullRequest
0 голосов
/ 28 февраля 2019

как мне получить 1-D индекс элемента матрицы?

например:

b=np.array([1, 2, 3, 4, 5, 6])
c = b.reshape(2,3,order='F')#colmaj
d = b.reshape(2,3)#rowmaj

это c:

([[1, 3, 5],
 [2, 4, 6]])

это d:

([[1, 2, 3],
 [4, 5, 6]])

, если я делаю c [1,2], я получаю элемент 6, и мне нужно получить индекс 1-D массива, который был бы 5. Я могу сделать этомысленно, но если у меня большая матрица и мне нужно выбрать элемент случайным образом, я не смогу.мне нужно написать функции, чтобы сделать это для матриц как colmajor, так и rowmajor.

def linearize_colmajor(i, j, m, n):        
        """
        Returns the linear index for the `(i, j)` entry of
        an `m`-by-`n` matrix stored in column-major order.
        """

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

np.ravel_multi_index преобразует nd-индекс в плоский, с возможностью указания order:

In [152]: np.ravel_multi_index((0,2),(2,3),order='C')                           
Out[152]: 2
In [153]: c[0,2], c.flat[2]                                                     
Out[153]: (5, 5)

Применение к случаю order='F' немного сложнее:

In [154]: np.ravel_multi_index([0,2],[2,3],order='F')                           
Out[154]: 4
In [155]: d[0,2], d.flat[4], d.ravel(order='F')[4]                              
Out[155]: (3, 5, 3)
In [156]: d.ravel()                                                             
Out[156]: array([1, 2, 3, 4, 5, 6])
In [157]: d.ravel(order='F')                                                    
Out[157]: array([1, 4, 2, 5, 3, 6])

Элемент [1,2] одинаков в обоих порядках, последний '6'.

Сравнение с примером @ Divakar:

In [160]: np.ravel_multi_index([1,1],[2,3],order='C')                           
Out[160]: 4
In [161]: np.ravel_multi_index([1,1],[2,3],order='F')                           
Out[161]: 3
0 голосов
/ 28 февраля 2019

Просто масштабируйте индекс строки по количеству столбцов и добавьте индекс столбца для основного порядка строк.Для порядка кол-мажор используйте число строк для масштабирования индекса строки и снова добавьте индекс столбца.

Следовательно, чтобы получить плоский индекс для rowmaj версии -

i*n+j

Чтобы получить сглаженный индекс для colmaj версии -

i*m+j

, где:

i = row index
j = col index
m = number of rows in the matrix
n = number of columns in the matrix

Перевод в формат функции -

def linearize(i, j, m, n, order='C'):
    if order=='C': # rowmaj
        return i*n+j
    elif order=='F': # colmaj
        return i*m+j
    else:
        raise Exception("Invalid order value")

Пример выполнения -

In [42]: linearize(i=1, j=1, m=2, n=3, order='C')
Out[42]: 4 # element : 5 in rowmaj array, d

In [43]: linearize(i=1, j=1, m=2, n=3, order='F')
Out[43]: 3 # element : 4 in colmaj array, c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...