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