2014-02-18 31 views
1

我正在使用一個2D列表,我想按行計算其平均值。下面是我的代碼:如何訪問Python中2D列表中的列?

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]) 

然而,上述塊生成此:

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

正如我在調試過程中發現,問題發生在colnp.mean(mylist[:][col])

我可以知道我錯了嗎?

謝謝。

回答

2

人去修補你的代碼(最小的變化)的方法是

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

然而,更好的辦法是避免for-loop和使用axis=0

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

axis=0告訴mean到取第一個軸的平均值,即 的行數。


一個小例子可以幫助你看到myarray[:][col]myarray[:, col]之間的區別:

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[:][0]選擇的myarray一個(複印件)第0 行。所以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-th項目。但mylist只有2個項目,2個列表。所以索引2是超出界限的 –

1

當你做你mylist[:]製作二維數組的一個副本,然後用mylist[:][col]你索引的第一個維度。試試這個:

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會給你列方向平均。