Предположим, у меня есть массив:
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]]
И я хочу получить копию меньшего массива, который всегда центрирован в середине x
, определив размер этой матрицы (неиндексы строки / столбца)
Например, если я хочу получить массив 2x2 из этого, он вернет:
[[5 6]
[9 10]]
Для моих целей мой начальный массив больше (4096x4096), и я хочувозьмите копию массива среднего квадрата размеров (128x128), (256x256), (512x512), (1024x1024), (2048x2048).
Я также хочу сохранить исходный массив, поэтому я не хочуобязательно хочу просто вырезать строки / столбцы из оригинала, вместо этого я хочу, чтобы копия оригинала была только обрезана, сохранена в новой переменной.
Я думал об определении некоторых переменных, таких как (для 2x2case):
rows_to_keep = [1,2]
cols_to_keep = [1,2]
, а затем использовать
x[np.ix_(rows_to_keep, columns_to_keep)]
Но это становится непрактичным, когда my rows_to_keep
представляет собой список из 2048 чисел, например, для копирования квадрата 128x128 из4096x4096 оригинал Я могу создать список индексов, который начинается в строке / столбце 1984и переходит к 2112:
size_to_keep = 128
indices = np.linspace(0, size_to_keep, size_to_keep, endpoint=False)
rows_to_keep = [(4096/2)-(size_to_keep/2) + i for i in indices]
cols_to_keep = [(4096/2)-(size_to_keep/2) + i for i in indices]
copy_array = x[np.ix_(rows_to_keep, columns_to_keep)]
Но опять это становится грязным / непрактичным.Я надеялся, что есть более питонический способ сделать это?Заранее спасибо