Нарезка массива 2D numpy с использованием векторов для индексов начала-остановки - PullRequest
1 голос
/ 09 июля 2020

Первый пост здесь, пожалуйста, go полегче. :)

Я хочу векторизовать следующее:

rowStart=array of length N        
rowStop=rowStart+4        
colStart=array of length N    
colStop=colStart+4    

x=np.random.rand(512,512) #dummy test array   

output=np.zeros([N,4,4])
for i in range(N):
   output[i,:,:]=x[ rowStart[i]:rowStop[i], colStart[i]:colStop[i] ]

То, что я хотел бы сделать, это что-то вроде:

output=x[rowStart:rowStop, colStart:colStop ]

где numpy распознает, что индексы срезов являются векторами, и транслирует срезы. Я понимаю, что это, вероятно, не сработает, потому что, хотя я знаю, что мои выходные данные среза всегда имеют одинаковый размер, numpy нет.

Я рассмотрел различные подходы, включая «причудливый» или « расширенная "индексация (которая, похоже, работает для индексации, а не нарезки), массивная логическая индексация с использованием сеток (непрактично с точки зрения памяти, поскольку мой N может достигать 50-100 тысяч) и np.take , что просто кажется еще одним способом выполнения причудливой / расширенной индексации.

Я мог бы увидеть, как я мог бы потенциально использовать необычную / расширенную индексацию, если бы мог получить массив, который выглядит так: * и аналогичный для столбцов, но у меня также возникли проблемы с определением векторизованного подхода для его создания.

Буду признателен за любой совет, который вы можете дать. Спасибо!

1 Ответ

1 голос
/ 09 июля 2020

Мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows, чтобы получить скольжение windows и, следовательно, решить наш случай здесь. Подробнее об использовании as_strided на основе view_as_windows.

from skimage.util.shape import view_as_windows

BSZ = (4, 4) # block size
w = view_as_windows(x, BSZ)
out = w[rowStart, colStart]
...