3

我有许多 (=1000+)、大型 (=1000000+ 记录) 数据文件,其中包含时间、x、y、z 数据。

我对一个示例文件使用了 numpy.loadtxt 来填充四个并行数组;例如,

ts, xs, ys, zs = numpy.loadtxt( 'sampledatafile.csv', delimiter=',', unpack=True)

我想选择这些并行数组的子集,其中时间在指定范围内;例如,

min_time = t0  # some time, in the same format as values in the data file
max_time = t1  # a later time

通过遍历 ts 数组,我已经能够做到这一点;像这样,

my_ts = []
my_xs = []
my_ys = []
my_zs = []

for row in range( len( ts ) ):
    if ( min_time <= ts[row] ) and ( ts[row] <= max_time ):
        my_ts.append( ts[row] )
        my_xs.append( ss[row] )
        my_ys.append( ys[row] )
        my_zs.append( zs[row] )

这里有更有效的方法吗?我认为另一种方法是使用 csv 文件阅读器加载每条记录,并在每条记录经过时检查它,而不是 numpy.loadtxt。

在 Python 中肯定有更聪明的方法吗?类似于“选择 ts 数组中符合条件的所有记录,以及并行数组中的相关元素”?是否有聪明而酷的语法?特别是如果它比上述方法更有效?

4

2 回答 2

4
arr = numpy.loadtxt( 'sampledatafile.csv', delimiter=',')
ts = arr[:, 0]
idx = (ts >= min_time) & (ts <= max_time)
my_ts, my_xs, my_ys, my_zs = arr[idx].T

如果您想首先对数组进行排序ts,您还可以使用np.argsort

idx = np.argsort(ts)
arr = arr[idx]
于 2013-09-23T17:37:20.080 回答
0

我不知道更快或更好,但更短:

from itertools import izip

arrays = [arr[min_time:max_time+1] for arr in (ts, xs, ys, zs)]

zip(*arrays)

这会给你一个元组列表(t, x, y, z)。或者,您可以获得一个字典列表dict(t=t, x=x, y=y, z=z)。如果您真的希望它们位于 4 个单独的列表中,那么您所做的而xrange不是 range 应该是合理的。

编辑:更新以考虑到 unutbu 的切片并纠正我的误解。

于 2013-09-23T17:37:08.837 回答