如何在Python中访问2D列表中的列?

时间:2014-02-18 13:25:27

标签: python numpy

我正在使用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:索引2超出轴0的大小为2

正如我在调试过程中发现的那样,问题发生在col

中的np.mean(mylist[:][col])

我可以知道我对此有何不妥吗?

感谢。

4 个答案:

答案 0 :(得分: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]选择了({1}}副本的第0行。因此,当myarray大于1时,myarray[:][col]会引发IndexError,因为只有2行。

答案 1 :(得分: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.]])

答案 2 :(得分:1)

当您mylist[:]制作2D数组的副本,然后使用mylist[:][col]时,您正在索引第一个维度。试试这个:

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

unutbu's answer更有效率。

答案 3 :(得分:1)

不能直接回答您的问题,但您可以指定一个轴来计算平均值:

np.mean(mylist, axis=0)

axis=0会给出逐行的平均值,而axis=1会给出逐列的意思。