如何创建前一个值不符合条件的索引数组?

时间:2014-12-12 21:31:26

标签: python arrays loops iteration enumerate

我有两个数组(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]

1 个答案:

答案 0 :(得分:4)

  1. 您可能需要obj >= thresh,使用==与您的问题说明不符。
  2. 为什么要将之前的值与None进行比较?您需要检查它是否< thresh
  3. 您能澄清一下nonzero()来电的内容吗?
  4. 您实际上并未在循环中创建数组。 v_1ffv_2ff是单个值 修复它的一种方法是预先创建列表(v_1ff = []),然后在匹配条件时将找到的值附加到列表中。
  5. v_1ff实际上是之前的,而不是之前的索引 - 您想要哪个?
  6. 如果你在两个列表上执行完全相同的操作,那么为一个列表创建一个函数会更干净,然后只需调用它两次。
  7. 你可以通过列表理解更轻松地完成所有这些:

    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 < thresh and next_val >= thresh是您的过滤条件