изменение вида n-мерного массива без использования изменения формы
ТЛ; др Могу ли я изменить вид массива numpy с 5x5x5x3x3x3 на 125x1x1x3x3x3 без использования numpy.reshape?
Я хотел бы выполнить операцию скользящего окна (с различными шагами) до объема (размер MxMxM). Массив скользящего окна может быть создан с использованиемnumpy.lib.stride_tricks.as_strided
как ранее предполагалосьВениамин а такжеEickenbergи продемонстрировано в следующем фрагменте кода, который используетвспомогательный метод от лыжного мага который используетas_strided
.
Выходные данные этого вспомогательного метода дают мне форму NxNxNxnxnxn, но я бы предпочел, чтобы эта форма была N ^ 3x1xnxnxn. Хотя я могу использовать np.reshape для достижения этой цели, np.reshape работает медленно, если объем становится большим (> 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])