【问题标题】:How do I make an array of the indices where the previous value did not meet a condition?如何制作前一个值不满足条件的索引数组?
【发布时间】:2014-12-12 21:31:26
【问题描述】:

我有两个数组(v_1v_2),我有一个函数可以获取这些数组,找到它们的值超过阈值的索引,找到数组的前一个值和下一个值,并返回一个新数组(v_1fv_2f)包含先前值未达到阈值的索引。

但是,由于某种原因,return 语句没有给我这些数组。这是为什么?另外,这个函数是否应该产生一个具有我想要的条件的数组?

def findbursts(v_1,v_2):

  for index, obj in enumerate(v_1):
      if obj == thresh:
          v_1f=(obj).nonzero()[0]
          # TODO Bounds-checking
          previous = v_1f[index - 1]
          if previous == None:
              v_1ff = v_1f

  for index, obj in enumerate(v_2):
      if obj == thresh:
          v_2f=(obj).nonzero()[0]
          # TODO Bounds-checking
          previous = v_2f[index - 1]
          if previous == None:
              v_2ff = v_2f

  return [v_1ff, v_2ff]

【问题讨论】:

  • 看起来您在第二个 for 循环中有一个额外的 return 语句。你确定应该在那里吗?
  • 糟糕。不,它不应该是,但它仍然不起作用。我还更新了函数来做我想做的事……我想。
  • 也许您可以包含一些示例数据和所需的结果,以便我们验证我们是否了解您的要求
  • 你说“......它们的值超过了阈值”,但你正在测试 gor obj == thresh
  • 你熟悉numpy吗?乍一看,numpy 似乎更适合这个问题。

标签: python arrays loops iteration enumerate


【解决方案1】:
  1. 您可能需要obj >= thresh,使用== 与您的问题描述不符。
  2. 为什么要将之前的值与None 进行比较?你需要检查它是否是< thresh
  3. 您能澄清一下nonzero() 电话的用途吗?
  4. 您实际上并没有在循环中创建数组。 v_1ffv_2ff 是单个值。
    修复它的一种方法是预先创建列表 (v_1ff = []),然后在匹配条件时将找到的值附加到列表中。
  5. v_1ff 实际上是之前的value,而不是之前的index——你想要哪个?
  6. 如果您在两个列表上执行完全相同的操作,那么创建一个对单个列表执行此操作的函数然后只调用两次会更简洁。

您可以通过列表推导更轻松地完成这一切:

from itertools import izip

def find_bursts(data, thresh):
    return [i for i, (val, next_val) in enumerate(izip(data[:-1], data[1:])) 
            if val < thresh and next_val >= thresh]

细分:

  • izip(data([:-1], data[1:]) 将数组作为相邻元素对进行迭代
  • enumerate 附加索引
  • if val &lt; thresh and next_val &gt;= thresh 是你的过滤条件

【讨论】:

  • 1) 两者都可以。我只想要达到阈值的值。 2)我对previous值的理解是,只有当前值达到阈值时它才有值。 3)我用它来构建非零索引的元组。 4) 是的。这就是我想做的。 5)我想要价值。我有另一个我已经知道的数组会给我索引。 6)有机会我会试试你的方法。它看起来很完美,但我对itertoolsizip 不是很熟悉(我是新手)。
  • 哇!谢谢!这就像一个魅力!我没想到会这么容易。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多