tl; dr Могу ли я изменить вид массива numpy от 5x5x5x3x3x3 до 125x1x1x3x3x3 без использования numpy.resape?Изменение формы n-мерного массива без использования reshape
Я хотел бы выполнить операцию раздвижного окна (с разными шагами) на том (размер MxMxM). Массив скользящего окна может быть сгенерирован с использованием numpy.lib.stride_tricks.as_strided
, как ранее было предложено Benjamin и Eickenberg, и продемонстрировано в приведенном ниже фрагменте кода, который использует helper method from skimage, который использует as_strided
.
Выход из этого вспомогательного метода дает мне форму NxNxNxnxnxn, но я бы предпочел, чтобы форма была N^3x1xnxnxn. Хотя я могу использовать np.reshape для достижения этого, np.resape медленный, если объем становится большим (> 100x100x100), что я не уверен, почему. Я думал, что могу использовать as_stride для изменения вывода, но с ошибками numpy (фрагмент кода ниже). Любые идеи о том, как я могу получить представление о выходе из вспомогательного метода как N ** 3x1xnxnxn без использования np.reshape?
import numpy as np
import skimage
l = 15
s = 3
X = np.ones((l,l,l))
print('actual shape',X.shape)
view = skimage.util.shape.view_as_blocks(X,(s,s,s))
print('original view',view.shape)
new_shape = ((l/s)**3,1,1,s,s,s)
print('new view',new_shape)
view_correct = view.reshape(new_shape)
print(view_correct.shape)
print('coord:','124,0,0,2,2,2','value:',view_correct[124,0,0,2,2,2])
view_incorrect = np.lib.stride_tricks.as_strided(view, shape=new_shape)
print(view_incorrect.shape)
print('coord:','124,0,0,2,2,2','value:',view_incorrect[124,0,0,2,2,2])
'view_as_blocks' использует' as_strided' с соответствующими 'strides' и' shape' для создания нового представления. И затем вы снова применяете 'as_strided', с другой' shape' (и другой 'ndim'), без изменения' strides'. Не следует ли применять 'as_strided' непосредственно к' X' - с правильными 'шагами' и' shape'? – hpaulj