2016-05-06 2 views
2

Ранее я задавал аналогичный вопрос, но я до сих пор не совсем уверен, как numpy упорядочивает его индексы.numpy ndarray indexing - получение индексов из кортежа

Я работаю со многими 3D-массивами, все из которых имеют одинаковый размер. из-за последующие операции (зрения, как окно с SciPy и другими) Мне нужно нарезать массивы, которые я делаю с серией операций, глядя, как это:

imFrag.append(Padded[:100, :100, :100) 

, который расщепляет массивы на 8 частей. Я пытаюсь получить исходные индексы для каждого из фрагментов. Я могу сделать это для всего трехмерного массива, используя:

np.where(Mat == Mat) 

, который дает мне кортеж, содержащий компоненты x, y и z. есть ли способ, которым я могу это сделать?

Спасибо!

+0

Так что 'imFrag' - это список? – hpaulj

ответ

1

Давайте попробуем что-нибудь маленькое и 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 

сделаю, но не очень.

+0

Возможно, я неверно истолковал последнюю часть с «tell sub sub произошло в Mat?». То, что я пытаюсь получить после резания, является координатой каждого элемента в sub. Используя ваш пример: ((2, 2, 3, 3), (2, 3, 2, 3)) будет расширенной индексацией для sub. - Как обход (скажите, если это смешно), я могу получить индексы np.where и просто добавить самый низкий срез для каждого кортежа? – JB1

+0

Да, вы можете использовать атрибут «start» среза для применения индексов 'sub' к' Mat'. Смотрите мои правки. – hpaulj

+0

Спасибо :) очень полезно, как всегда! – JB1

1

Рассматривают хранения ломтик объекты вместо fragements сами

your_slice = np.s_[:100, :100, :100] 

Чтобы получить изображение только

Padded[your_slice] 

Чтобы получить индексы вы использовали, чтобы создать кусочек

your_slice[0].start 
your_slice[0].step 
your_slice[0].stop 

для какой размер вы заботитесь

Смежные вопросы