从并行数组中进行选择

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数组中的所有记录以及平行数组中的相关元素”这样的东西。如果它比上述方法更有效,则有聪明,酷炫的语法吗?


2
如果你正在使用 Python <3,那么你应该使用 xrange 而不是 range。 - nmichaels
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]

由于时间戳不是整数,您可以使用np.ceilint将它们四舍五入到正确的整数索引。我已经编辑了我的帖子以展示我的意思。 - unutbu
遗憾的是,时间既不排序也不是整数。我的代码中的循环有效地执行了最后一个建议:idx = (ts >= t0) & (ts <= t1),但效率低下。使用这个建议(创建一个指定数据中“happy rows”的idx数组)似乎可以让我达到目标,使用Python来提高效率。 - Bruce Simonson
@unutbu - 我认为你的解决方案已经做到了。但是,我发现有两件事情我必须要做才能使它正常工作: - Bruce Simonson
@unutbu - 我认为你的解决方案已经解决了问题。我发现调用numpy.loadtxt时必须将unpack=False作为参数传递,而我在代码中将其设置为True,以便最后一行能够正常工作。对于那些numpy专家来说可能很明显,但是这让我卡住了一段时间。 - Bruce Simonson
嗯,这很奇怪,因为 unpack=False 是默认设置。 - unutbu
显示剩余9条评论

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 的切片和修正我的误解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接