2014-02-18 2 views
1

Я пытаюсь манипулировать значениями N-мерного массива на основе решения пользователя, при котором индекс должен быть изменен. Этот пример работает отлично:Переходящий список как срез для N-мерного массива numpy

import numpy as np 
a = np.arange(24).reshape(2,3,4) 

toChange = ['0', '0', '0'] #input from user via raw_input 

a[toChange] = 0 

Но если я хочу, чтобы изменить не только одну позицию, но полный ряд, я бегу в проблемы:

toChange = ['0', '0', ':'] #input from user via raw_input 

a[toChange] = 0 

Это вызывает ValueError: setting an array element with a sequence. Я вижу, что проблема состоит в строке ':', потому что a[0, 0, :] = 0 делает именно то, что я хочу. Вопрос в том, как передать строку в массив?

Или есть более умный способ манипулирования пользовательскими срезами?

PS: а я работаю на Debian я старого стабильного использовать Python 2.6.6 и Numpy 1.4.1

ответ

1

: является синтаксический сахар для slice объекта:

>>> class Indexable(object): 
...  def __getitem__(self, idx): 
...   return idx 
...  
>>> Indexable()[0, 0, :] 
(0, 0, slice(None, None, None)) 

Так что если вы замените ':' с slice(None, None, None) вы получите желаемый результат:

>>> toChange = [0, 0, slice(None, None, None)] 
>>> a[toChange] = 0 
>>> a 
array([[[ 0, 0, 0, 0], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]], 

     [[12, 13, 14, 15], 
     [16, 17, 18, 19], 
     [20, 21, 22, 23]]]) 
+0

Благодарим за быстрый ответ! Это хорошо работает в интерактивном режиме, но каким-то образом в моем скрипте я получаю новую ошибку: 'toChange = [0, 0, slice (None, None, None)] TypeError: объект 'numpy.ndarray' не может быть вызван' Is есть ли вероятность, что 'toChange' считается массивом? – Gnihilo

+0

Использование кортежа для ND-индексов является предпочтительным. Использование List/Sequence зависит от шаткой логики, и я лично предпочел бы просто запретить это. – seberg

+0

У меня проблема: нарезка не работала, потому что перед манипуляцией массивом я писал весь массив в файл, используя 'с открытым (« out/histData.txt »,« w ») в качестве dataFile: для фрагмента в histData: np.savetxt (dataFile, slice, fmt = "%. 2f", delimiter = "\ t") ' Поэтому' slice' был ndarray, и все это не сработало. Любительский час :-) @seberg: как бы выглядело это решение? – Gnihilo

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