Как мне проиндексировать двумерную часть двумерного массива? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть двумерный массив, который я пытаюсь нарезать до определенного диапазона как в столбцах, так и в строках. До сих пор я использовал numpy.where() для индексации своего массива, где один индекс - это массив, а другой - скаляр; т.е. я индексирую часть одной строки или столбца. Теперь я хотел бы получить все записи в определенном диапазоне столбцов и определенном диапазоне строк, но, кажется, numpy не нравится, когда я это делаю.

Я пробовал это:

findex = np.where((freqs>63)&(freqs<92))
findex = np.array(findex[0])
tindex = np.where((t>0.5)&(t<1.5))
tindex = np.array(tindex[0])

print(Xsum[findex,tindex])

, где Xsum (спектрограмма) - мой массив, а freqs, t - массивы (shape (x, 1)), формы которых соответствуют до количество столбцов и строк Xsum. Мне нужно иметь возможность находить записи в Xsum по значениям в freqs и t, поэтому я использую numpy.where().

Это сообщение об ошибке, которое я получаю:

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

Я искал другие способы сделать это, но без игры в кости. Есть ли способ для меня индексировать мой массив, чтобы я получил его блок, а не столбец или строку?

Редактировать: Например, скажем, мой массив:

np.array([1,2,3,4],
         [5,6,7,8],
         [9,10,11,12])

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

([6,7,8],
 [10,11,12])

, то есть записей во 2-й и 3-й строках и 2-м и 4-м столбцах, учитывая, что я не знаю точных индексов, которые я ищу, только значения в других массивах, поэтому мне пришлось использовать numpy.where().

1 Ответ

0 голосов
/ 12 февраля 2020

Basi c Индексирование срезами является самым простым способом:

In [382]: arr = np.arange(1,13).reshape(3,4)                                                   
In [383]: arr[1:, 1:]                                                                          
Out[383]: 
array([[ 6,  7,  8],
       [10, 11, 12]])

Со списками или массивами они должны broadcast друг против друга:

In [385]: arr[[[1],[2]], [1,2,3] ]                                                             
Out[385]: 
array([[ 6,  7,  8],
       [10, 11, 12]])

Или эквивалентно с массивами:

In [386]: np.ix_([1,2],[1,2,3])                                                                
Out[386]: 
(array([[1],
        [2]]), array([[1, 2, 3]]))
In [387]: arr[_]                                                                               
Out[387]: 
array([[ 6,  7,  8],
       [10, 11, 12]])

То есть массив (2,1) объединяется с (3,) (или (1,3)) для выбора (2,3) блока.

Если два массива / списка не совпадают по длине, вы получите ошибку:

In [388]: arr[[1,2], [1,2,3] ]                                                                 
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-388-f14b94e53ccb> in <module>
----> 1 arr[[1,2], [1,2,3] ]

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

Если они совпадают по длине, вы получите «диагональ», а не блок:

In [389]: arr[[1,2], [1,2] ]                                                                   
Out[389]: array([ 6, 11])

Чем больше вы понимаете broadcasting, тем яснее становится. Здесь применяются те же правила добавления массивов.

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