Я хочу нарізати масив 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 зробити копію потрібного масиву, таким чином, при обробці великих масивів це може стати проблемою. Чому це так / як працює цей механізм?