2014-02-18 2 views
1

저는 2D 목록을 사용하고 있습니다. 행의 평균값을 계산하고 싶습니다.Python에서 2D 목록의 열에 액세스하는 방법은 무엇입니까?

IndexError: index 2 is out of bounds for axis 0 with size 2

내가 디버깅하는 동안 찾을 때, 문제는 내가 뭘 알고있다

np.mean(mylist[:][col])col에서 발생합니다

import numpy as np 

mylist = np.zeros((2,120)) # This gives you a 2 by 120 2D list with 2 rows, and 120 columns 
average_list = np.zeros(120) 

for col in xrange(120): 
    average_list[col] = np.mean(mylist[:][col]) 

그러나, 상기 청크이 생성 다음은 내 코드입니다 이것에 대해 내가 틀렸어?

감사합니다.

답변

2

한 가지 방법은

for col in xrange(120): 
    average_array[col] = np.mean(myarray[:, col]) 

그러나, 더 나은 방법은 for-loop을 방지하고 axis=0 사용하는 것이 될 것이다 첫 번째 축을 평균값으로 취하십시오. 즉, 행은 입니다. 만약 myarray[:][0]myarray A (사본)의 0 번째 선택시피

In [7]: myarray = np.arange(6).reshape(2,3) 

In [8]: myarray 
Out[8]: 
array([[0, 1, 2], 
     [3, 4, 5]]) 

In [9]: myarray[:][0] 
Out[9]: array([0, 1, 2]) 

In [10]: myarray[:, 0] 
Out[10]: array([0, 3]) 

:


작은 예는 myarray[:][col]myarray[:, col]의 차이를 확인하는 데 도움이된다. 그래서 myarray[:][col]col이 1보다 크면 IndexError를 발생시킵니다. 왜냐하면 2 행만 있기 때문입니다.

1

mylist에는 2 개의 목록이 있습니다. 따라서 인덱스 2는 범위를 벗어납니다.

>>> mylist 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 
     0., 0., 0.]]) 
+0

'np.mean (mylist [:] [col])'이라고 말하면, 2D 목록의 모든 목록에서'col' 요소를 방문한다고 생각합니다. 내가 틀렸다면 나를 바로 잡아주세요. 감사. :) – ChangeMyName

+1

'mylist [:] [col]'는 mylist의 사본을 만들고'col' 항목을 얻는다는 것을 의미합니다. 그러나 mylist는 단지 2 개의 항목, 2 개의 목록을 가지고 있습니다. 따라서 색인 2는 범위를 벗어났습니다. –

1

당신은 2 차원 배열의 복사본을 다음 mylist[:][col]와 함께 첫 번째 차원을 색인하는 mylist[:]을 수행 할 때. 이것을 시도하십시오 :

for col in xrange(120): 
    average_list[col] = np.mean([ x[col] for x in mylist]) 

그러나 unutbu's answer은 훨씬 더 효율적입니다.

1
직접

하지 질문에 대한 답변,하지만 당신의 평균을 계산하는 축을 지정할 수 있습니다

np.mean(mylist, axis=0) 

axis=0 당신에게 줄 것이다 행이 많다는 의미 axis=1 반면 당신에게 열 현명한 평균을 줄 것이다 .

average_array = myarray.mean(axis=0) # 1 

axis=0mean를 알려줍니다 (최소한의 변경) 코드를 해결하기 위해

관련 문제