2014-02-18 3 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 : 당신이 대체한다면

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

: 내가 oldstable 데비안에서 일하고 있어요 나는 파이썬 2.6.6와 NumPy와 1.4.1

답변

1

:slice 개체에 대한 문법 설탕이다 사용 ':'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'객체를 호출 할 수 없습니다. toChange가 배열로 간주 될 가능성이 있습니까? – Gnihilo

+0

튜플을 사용하여 ND- 색인을 수행하는 것이 좋습니다. 목록/시퀀스 사용법은 흔들리는 논리에 달려 있으며 개인적으로는 금지하기를 선호합니다. – seberg

+0

좋아요, 문제가 있습니다. 배열을 조작하기 전에 배열을 조작하기 전에 전체 배열을 'with open ("out/histData.txt", "w")을 dataFile로 사용하여 파일에 쓰려고했기 때문에 문제가 발생했습니다. histData의 조각 : np.savetxt (dataFile, slice, fmt = "% 2f", 구분 기호 = "\ t")' 따라서'slice'는 ndarray 였고 모든 것이 작동하지 않았습니다. 아마추어 시간 :-) @seberg :이 솔루션은 어떻게 생겼습니까? – Gnihilo