Numpy вызов значений массива по списку индексов - PullRequest
0 голосов
/ 19 марта 2020

У меня есть двумерный массив значений, и я хочу назвать его двумя списками индексов x, y. Раньше он работал идеально, я не знаю, почему он сейчас не работает, может быть, python версия, не уверен.

x = np.squeeze(np.where(data['info'][:,2]==cdp)[0])
y = np.squeeze(np.where((data['Time']>=ub) & (data['Time']<=lb))[0])

s = data['gather'][x,y]

Ошибка:

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (36,) (45,) 

Не знаю т в чем проблема. Это работает, когда я делаю это в два этапа.

s = data['gather'][:,y]; s = s[x,:]

Но я не могу этого сделать, мне нужно сделать за один проход

1 Ответ

1 голос
/ 19 марта 2020
In [92]: data = np.arange(12).reshape(3,4)                                                                           
In [93]: x,y = np.arange(3), np.arange(4)                                                                            
In [94]: data[x,y]                                                                                                   
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-94-8bd18da6c0ef> in <module>
----> 1 data[x,y]

IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (4,) 

Когда вы предоставляете 2 или более массивов в качестве индексов, numpy транслирует их друг против друга. Важно понимать broadcasting.

В MATLAB, обеспечивающем два индексных массива (фактически 2d матрицы), выбирает блок. В numpy для массивов, если они совпадают по форме, извлекаются элементы, например, по диагонали:

In [99]: data[x,x]                                                                                                   
Out[99]: array([ 0,  5, 10])

Для эквивалента MATLAB требуется дополнительная функция, «indexs to sub» или какое-то подобное имя.

Двухступенчатое индексирование:

In [95]: data[:,y][x,:]                                                                                              
Out[95]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

ix_ - это удобный инструмент для построения индексов для доступа к блоку:

In [96]: data[np.ix_(x,y)]                                                                                           
Out[96]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

Обратите внимание на то, что он производит:

In [97]: np.ix_(x,y)                                                                                                 
Out[97]: 
(array([[0],
        [1],
        [2]]), array([[0, 1, 2, 3]]))

это то же самое, что и:

In [98]: data[x[:,None], y]                                                                                          
Out[98]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

x[:,None] - (3,1), y - (4,); они передают, чтобы произвести (3,4) выбор.

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