【问题标题】:selecting from parallel arrays从并行数组中选择
【发布时间】:2013-09-24 02:34:16
【问题描述】:

我有许多 (=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 数组中符合条件的所有记录,以及并行数组中的相关元素”?为此,是否有聪明而酷的语法?特别是如果它比上述方法更有效?

【问题讨论】:

  • 如果你使用 Python

标签: python arrays numpy parallel-processing selection


【解决方案1】:
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]

【讨论】:

  • 这仅在tsrange 函数的输出相同时有效。
  • @nmichaels:他已经在使用for row in range(...)ts[row]。所以ts 可以这样被索引——假设min_timemax_time是整数。
  • 对,我错过了。
  • 时间戳不是整数,遗憾的是。但是一个聪明的想法,使用切片。感谢您的建议。
  • @user2808134:由于时间戳不是整数,您可以使用np.ceilint 将它们四舍五入到正确的整数索引。我已经编辑了我的帖子以说明我的意思。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2013-12-25
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多