Индексирование вектора с помощью матрицы признаков с numpy, аналогично MATLAB - PullRequest
1 голос
/ 11 января 2020

Я хочу вытащить матрицу, заполненную значениями из вектора, индексированного матрицей индексов
т.е. output(i, j) = vector(indices(i, j))

В Matlab это может быть достигнуто с помощью output = vector(indices).

В Python / numpy для этой цели у меня есть следующее l oop, но мне было интересно, есть ли более эффективный способ сделать это:

    idx = np.random.randint(0, 100, (25, 10))
    data = np.random.random(100)
    output = np.empty((np.size(idx, 0), np.size(idx, 1)))
    for i in range(0, np.size(idx, 0)):
        output[i, :] = np.squeeze(data[idx[i, :]])

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 11 января 2020
In [547]: idx = np.random.randint(0, 100, (25, 10)) 
     ...: data = np.random.random(100) 
     ...: output = np.empty((np.size(idx, 0), np.size(idx, 1))) 
     ...: for i in range(0, np.size(idx, 0)): 
     ...:    output[i, :] = np.squeeze(data[idx[i, :]]) 

In [553]: idx.shape                                                                                       
Out[553]: (25, 10)
In [554]: output.shape                                                                                    
Out[554]: (25, 10)

Просто индексировать; нет необходимости повторять

In [555]: np.allclose(output, data[idx])                                                                  
Out[555]: True

Существуют различия между MATLAB и numpy при индексации с двумя массивами, по одному для каждого измерения. Проще говоря, в MATLAB проще индексировать блок, в numpy индексирование диагонали более прямое. Но это не относится к делу.

0 голосов
/ 11 января 2020
Output=vector[x, y]

X и Y - выбранные вами координаты. Аналогично, если вы хотите указать интервал:

Output=vector[X1:X2, Y1:Y2]

Просто [] вместо ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...