Я хочу нарезать массив NumPy nxn. Я хочу извлечь произвольный выбор из m строк и столбцов этого массива (т.е. без какого-либо шаблона в количестве строк / столбцов), сделав его новым массивом mxm. Для этого примера допустим, что массив 4x4, и я хочу извлечь из него массив 2x2.
Вот наш массив:
from numpy import *
x = range(16)
x = reshape(x,(4,4))
print x
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
Строка и столбцы для удаления совпадают. Самый простой случай, когда я хочу извлечь подматрицу 2x2, которая находится в начале или в конце, то есть:
In [33]: x[0:2,0:2]
Out[33]:
array([[0, 1],
[4, 5]])
In [34]: x[2:,2:]
Out[34]:
array([[10, 11],
[14, 15]])
Но что, если мне нужно удалить другую смесь строк / столбцов? Что если мне нужно удалить первую и третью строки / строки, извлекая таким образом подматрицу [[5,7],[13,15]]
? Может быть любая композиция строк / строк. Я где-то читал, что мне просто нужно проиндексировать мой массив, используя массивы / списки индексов для строк и столбцов, но это, похоже, не работает:
In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])
Я нашел один способ, а именно:
In [61]: x[[1,3]][:,[1,3]]
Out[61]:
array([[ 5, 7],
[13, 15]])
Первая проблема заключается в том, что она едва читаема, хотя я могу жить с этим. Если у кого-то есть лучшее решение, я, конечно, хотел бы услышать это.
Другое дело, что я читал на форуме, что индексация массивов с помощью массивов вынуждает NumPy сделать копию нужного массива, поэтому при обработке больших массивов это может стать проблемой. Почему это так / как работает этот механизм?