Как мне индексировать двумерную часть двумерного массива?

У меня есть двумерный массив, который я пытаюсь нарезать до определенного диапазона в столбцах и строках. До сих пор я использовал 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 ответ


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

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 тем яснее становится. Здесь применяются те же правила добавления массивов.


Есть идеи?

10000