Давайте попробуем что-нибудь маленькое и 2d:
In [102]: Mat = np.arange(16).reshape(4,4)
In [103]: sub = Mat[2:,:2]
In [104]: Mat
Out[104]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [105]: sub
Out[105]:
array([[ 8, 9],
[12, 13]])
Вам интересно, как сказать, были sub
произошли в Mat
?
В общей практике лучше всего повесить на шаговом кортеж
In [106]: ind=(slice(2,None),slice(None,2))
In [107]: Mat[ind]
Out[107]:
array([[ 8, 9],
[12, 13]])
In [108]: Mat[ind] += sub # duplicate the sub values
In [109]: Mat
Out[109]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[16, 18, 10, 11],
[24, 26, 14, 15]])
(np.s_
хороший способ построения такого кортежа, если вы предпочитаете синтаксис двоеточия).
Я думаю, что я мог бы вывести эту нарезку из информации в Mat
и sub
, например.
In [120]: Mat.__array_interface__['data'][0],Mat.shape,Mat.strides,Mat.itemsize
Out[120]: (169022104, (4, 4), (16, 4), 4)
In [121]: sub.__array_interface__['data'][0],sub.shape,sub.strides
Out[121]: (169022136, (2, 2), (16, 4))
, но для этого требуется некоторое понимание того, как хранятся и доступны данные. Для простых фрагментов, подобных этому, не должно быть слишком сложно. Для более общих, например, с шагами и транспозициями, было бы сложнее.
Но мне никогда не приходилось это делать. Продвинуться на исходный нарезной кортеж проще. И если вы выполняете расширенную индексацию (которая создает копию, а не представление), то висит на индексировании или маскировке - единственный способ.
=====================
Ниже на ваш комментарий:
In [140]: I,J=np.where(sub==sub)
In [141]: ind
Out[141]: (slice(2, None, None), slice(None, 2, None))
In [142]: Mat[2+I,0+J] # 0 inplace of None for J
Out[142]: array([16, 18, 24, 26])
Так да, вы можете использовать индексы от sub
к найти соответствующие элементы в Mat
.Использование where(sub==sub)
, чтобы получить все индексы, меня немного задевает. meshgrid
и mgrid
будут работать, но они требуют генерации диапазонов. Я не могу отвлечься от функции, которая принимает форму и дает соответствующие I,J
.
I,J=np.array(list(np.ndindex(sub.shape))).T
сделаю, но не очень.
Так что 'imFrag' - это список? – hpaulj