【问题标题】:Can I use a lambda expression here (selecting records from a numpy.core.records.recarray)?我可以在这里使用 lambda 表达式(从 numpy.core.records.recarray 中选择记录)吗?
【发布时间】:2012-02-11 18:07:03
【问题描述】:

我有以下代码 sn-p,它将数据从 CSV 文件加载到 numpy.core.records.recarray:

r = mlab.csv2rec(datafile, delimiter=',', names=('dt', 'val'))
data = zip(date2num(r['dt']),r['val']) # Need to filter for records lying between two dates here ...

我只想“压缩”日期介于(例如)“2000-01-01”和 2000-03-01'之间的记录

我了解 lambda 函数的概念 - 但我以前没有使用过它们。如果我可以使用 lambda 过滤所需日期之间的记录,那就太酷了(如下面的伪代码所示):

data = zip(lambda: date2num(r['dt']),r['val'] if r['dt'] > '2000-01-01' and r['dt'] < '2000-03-01' )

根据指定的索引(即日期)从 rec.array 中提取数据子集的 Pythonic 方法是什么?

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    由于您使用的是 numpy,因此不需要 lambda 函数来执行此类操作。

    这里是一个例子,你可以用值作为 r["dt"] >= date(2000,1,1) 的数组,这将得到一个布尔数组,并使用“&”运算符,你可以按位计算和两个布尔数组。最后,使用一个bool数组作为索引,就可以得到True对应的值。

    import pylab as pl
    import StringIO
    from datetime import date
    data = """2000-01-01,3
    1999-04-01,5
    2000-01-11,4
    2000-02-21,7
    2000-08-12,8
    """
    
    r = pl.csv2rec(StringIO.StringIO(data), delimiter=",", names=("dt","val"))
    mask = (r["dt"] >= date(2000,1,1)) & (r["dt"] <= date(2000,3,1))
    
    r2 = r[mask]
    
    print zip(pl.date2num(r2["dt"]), r2["val"])
    

    【讨论】:

    • +1 表示替代方法。让我想起了一点R ...我想知道这两个答案中哪个更有效?
    • @HomunculusReticulli 如果性能对您来说真的很重要,请查看 timeit 模块 docs.python.org/library/timeit.html - 它可以让您轻松测试两种替代方法。
    【解决方案2】:

    对于 list comprehensions 及其表兄弟解决的同一问题,Lambda(通常与 map 或 filter 结合使用)通常是一种不那么 Python 且清晰的解决方案。

    [dt, val for dt, val in zip(date2num(r['dt'], r['val'])) if '2000-01-01' < r['dt'] < '2000-03-01']
    

    【讨论】:

      猜你喜欢
      • 2017-06-15
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多