Нарезка массива NumPy 2d, или как мне извлечь подматрицу mxm из массива nxn (n> m)?

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

164
задан Alex Riley 3 March 2015 в 20:40
поделиться