1

我正在寻找一个优雅的解决方案:

data = np.loadtxt(file)
# data[:,0] is a time
# data[:,1] is what I want to extract
mean = 0.0
count = 0
for n in xrange(np.size(data[:,0])):
    if data[n,0] >= tstart and data[n,0] <= tend:
        mean = mean + data[n,1]
        count = count + 1

mean = mean / float(count)

我猜我也可以先提取我的 2D 数组然后应用np.mean它,但我觉得可能有一些列表理解的优点可以使它更优雅(我来自 FORTRAN 背景......)。我在想类似的东西(显然是错误的,因为i它不是索引):

np.mean([x for x in data[i,1] for i in data[:,0] if i >= tstart and i <= tend])
4

1 回答 1

4

在 numpy 中,您可以使用列表和数组来进行索引,而不是 listcomps。具体来说,假设我们有一个像您正在使用的那样的二维数组:

>>> import numpy as np
>>> data = np.arange(20).reshape(10, 2)
>>> data
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11],
       [12, 13],
       [14, 15],
       [16, 17],
       [18, 19]])

我们可以得到第一列:

>>> ts = data[:,0] 
>>> ts
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

并创建一个与我们想要的术语相对应的布尔数组:

>>> (ts >= 2) & (ts <= 6)
array([False,  True,  True,  True, False, False, False, False, False, False], dtype=bool)

然后我们可以使用它来选择我们感兴趣的列的元素:

>>> data[:,1][(ts >= 2) & (ts <= 6)]
array([3, 5, 7])

最后取其平均值:

>>> np.mean(data[:,1][(ts >= 2) & (ts <= 6)])
5.0

或者,在一行中:

>>> np.mean(data[:,1][(data[:,0] >= 2) & (data[:,0] <= 6)])
5.0

[编辑:data[:,1][(data[:,0] >= 2) & (data[:,0] <= 6)].mean()也可以;我总是忘记你可以使用方法。]

于 2012-07-11T04:19:32.077 回答