【问题标题】:Get the first value of a list that match some criteria and then set posterior values to zero in python获取与某些条件匹配的列表的第一个值,然后在 python 中将后验值设置为零
【发布时间】:2020-10-02 15:14:41
【问题描述】:

我有很多这种形式的一维列表:

[   0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  , 9216.24,
    9441.44, 9584.14]

[   0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    9040.62, 9320.95, 9454.16, 9564.21, 9647.48, 9694.4 , 9734.68,
    9762.59, 9788.14]

我想找到第一个大于零的值,然后将所有后验值设置为零,以这种方式。

[   0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  , 9216.24,
    0., 0.]

[   0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    9040.62, 0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  , 0.]

我很确定有一种非常 Pythonic 的方法可以做到这一点。它可以在 python 列表或 numpy 数组中。

谢谢

【问题讨论】:

  • then set all the other values to zeroposterior values to zero 之间存在差异。是哪一个?
  • 另外,它是一个常规的二维数组吗,即所有列表都具有相同数量的元素吗?
  • 它只是一个一维数组,并且是后验的。
  • 我们可以假设所有列表都具有相同数量的元素吗?另外,它是一维数组还是一维列表?
  • 1- 是的,2- 是一个列表,但可以作为一个 numpy 数组来解决。

标签: python arrays numpy


【解决方案1】:

使用next函数查找第一个满足条件的元素的索引,然后简单的列表推导将0设置为除满足条件的元素之外的所有元素:

a = [   0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
    9040.62, 9320.95, 9454.16, 9564.21, 9647.48, 9694.4 , 9734.68,
    9762.59, 9788.14]
    
ind = next(iter for iter,x in enumerate(a) if x>0)
b = [0 if i!=ind else a[ind] for i in range(len(a))]
print(b)

输出:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9040.62, 0, 0, 0, 0, 0, 0, 0, 0]

您还可以通过创建全零列表来创建输出并在其位置设置数字:

b = [0]*len(a)
b[ind] = a[ind]

当然 - 导致相同的结果

【讨论】:

    【解决方案2】:

    将您的一维列表转换为 numpy 数组,查找第一个非零元素,并将以下所有元素设置为 0:

    x = numpy.array([0., 0., 0., 1., 2., 3.])
    x[x.nonzero()[0][1]:] = 0
    

    【讨论】:

      【解决方案3】:

      如果会推荐使用numpy 进行此类操作。应该比使用循环更快、更高效。

      如果您只想保留第一个非零元素并将所有其他元素归零,您可以执行以下操作:

      import numpy as np
      
      array_1 = np.array([   0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
          0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,    0.  ,
          9040.62, 9320.95, 9454.16, 9564.21, 9647.48, 9694.4 , 9734.68,
          9762.59, 9788.14])
          
      indices_nonzero = np.nonzero(array_1)
      
      # Ignore the first non zero index from the filter, set all other values to zero
      array_1[indices_nonzero[0][1:]] = 0.0
      
      print(array_1)
      

      输出应该是:

      [    0.       0.       0.       0.       0.       0.       0.       0.                                                                                                                       
           0.       0.       0.       0.       0.       0.    9040.62     0.                                                                                                                       
           0.       0.       0.       0.       0.       0.       0.  ] 
      

      【讨论】:

        【解决方案4】:
        l = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 9040.62,
         9320.95, 9454.16, 9564.21, 9647.48, 9694.4, 9734.68, 9762.59, 9788.14]9454.16, 9564.21, 9647.48, 9694.4, 9734.68, 9762.59, 9788.14]
        index, value = next(filter(lambda t: t[1] > 0, enumerate(l)))
        result = l[:index] + [l[index]] + [0] * (len(l) - index - 1)
        

        【讨论】:

          【解决方案5】:

          我建议使用 np.argwhere 来获取第一个匹配的索引。此解决方案也适用于按字典顺序排列的多维数组。

          result = np.zeros(a.shape)
          
          try:
              firstIndex = np.argwhere(a > 0)[0].tolist()
              result[firstIndex] = a[firstIndex]
          except IndexError:
              raise ValueError("No positive value in this array")
          

          【讨论】:

            猜你喜欢
            • 2020-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多