Я хочу обрезать массив 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 делать копию желаемого массива, поэтому при обработке большие массивы, это может стать проблемой. Почему это так/как работает этот механизм?