【问题标题】:Python - Replacing Values Leading Up To 1s in an ArrayPython - 替换数组中以 1 开头的值
【发布时间】:2023-01-19 22:27:31
【问题描述】:

假设我有一个由 0 和 1 组成的熊猫系列,但这可以与 numpy 数组或任何可迭代对象一起使用。我想创建一个公式,它将采用一个数组和一个输入 n,然后返回一个新系列,该系列在第 n 个索引处包含 1,直到每次原始系列中至少有一个 1。这是一个例子:

array = np.array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1])

> preceding_indices_function(array, 2)
np.array([0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1])

对于每次输入数组中有一个 1,它前面的两个索引都用 1 填充,而不管原始数组中该索引中是否有 0 或 1。

我真的很感激这方面的帮助。谢谢!

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    使用与np.convolve 的卷积:

    N = 2
    
    # craft a custom kernel
    kernel = np.ones(2*N+1)
    kernel[-N:] = 0
    # array([1, 1, 1, 0, 0])
    
    out = (np.convolve(array, kernel, mode='same') != 0).astype(int)
    

    输出:

    array([0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1])
    

    【讨论】:

      【解决方案2】:
      import numpy as np
      
      array = np.array([0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1])
      
      array = np.array([a or array[idx+1] or array[idx+2] for idx, a in enumerate(array[:-2])] + [array[-2] or array[-1]] + [array[-1]])
      

      【讨论】:

        【解决方案3】:

        如果 a 是一个列表,这个函数就可以工作,也应该与其他可迭代对象一起工作:

        def preceding_indices_function(array, n):
          for i in range(len(a)):
            if array[i] == 1:
              for j in range(n):
                if i-j-1 >= 0:
                  array[i-j-1] = 1
          return array
        

        【讨论】:

          【解决方案4】:

          我得到了一个类似于另一个的解决方案,但在我看来稍微简单一些:

          >>> [1 if (array[i+1] == 1 or array[i+2] == 1) else x for i,x in enumerate(array) if i < len(array) - 2]
          [0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-13
            • 1970-01-01
            • 2021-09-16
            • 2018-08-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多