我正在使用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])
我可以知道我对此有何不妥吗?
感谢。
答案 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
会给出逐列的意思。