【问题标题】:How to Increment the first element in a row if the second element is equal to desired number in Numpy?如果第二个元素等于 Numpy 中的所需数字,如何增加行中的第一个元素?
【发布时间】:2021-08-15 11:15:49
【问题描述】:

假设我有一个 2D Numpy 数组,其结构如下所示:

my_list = np.array( [[a,b],
                     [c,d],
                     [e,f],
                    ...  ] )

现在考虑一个输入列表,例如[1,2,3,4,5]。我想将 my_list 的每个第一个元素(第一列的元素)与输入列表匹配,并在匹配发生的地方增加 my_list 的第二个元素。

如何使用 NumPy 函数实现这一点?
我试过map( lambda x: np.add(my_list[:,1] , 1 , where = (my_list[:,0] == x) ) , inp_list) 但这给了我一些奇怪的结果,这与我想要的相差甚远。

举个例子吧。

my_list = np.array( [[1,100],
                     [2,120],
                     [3,150],
                     [4,190],
                     [5,98],])
input_list = [1,4,5]

将上面的 sn-p 视为输入。现在我正在寻找这样的输出:

my_output = np.array( [[1,101],
                       [2,120],
                       [3,150],
                       [4,191],
                       [5,99],])

基本上,与 input_list 匹配的每一行的第二列都加一。

【问题讨论】:

  • 你能展示示例输入和输出吗?
  • 当然,我在问题中添加了一个示例。
  • my_list 第一列的值是否总是连续的?
  • 不,并非总是如此。
  • input_list 中的值是否都是唯一的?

标签: python arrays list numpy


【解决方案1】:

您可以使用np.isin 来检查值是否在列表中,然后使用np.where 来获取值,即value+1 如果在列表中,否则只是值,并将其分配回切片:

my_list[:,1] = np.where(np.isin(my_list[:,0],input_list), my_list[:,1]+1, my_list[:,1])

输出:

array([[  1, 101],
       [  2, 120],
       [  3, 150],
       [  4, 191],
       [  5,  99]])

【讨论】:

    【解决方案2】:

    一种非常直接的方法是将数组my_list 转换为dict,一种计数器,然后使用input_list 中的键更新它:

    >>> d = dict(my_list)
    {1: 100, 2: 120, 3: 150, 4: 190, 5: 98}
    

    更新 dict d:

    >>> for x in input_list:
    ...   d[x] += 1
    

    然后转换回一个ndarray

    >>> np.stack(list(d.items()))
    array([[  1, 101],
           [  2, 120],
           [  3, 150],
           [  4, 191],
           [  5,  99]])
    

    【讨论】:

    • 有趣的是,我第一次编码时使用了相同的方法来计算它。
    【解决方案3】:

    试试这个:

    my_list = np.array([[1,100],
                        [2,120],
                        [3,150],
                        [4,190],
                        [5,98]])
    
    input_list = np.array([1,4,5])
    
    my_list[:,1] += np.logical_or.reduce(my_list[:,0,None] == input_list, axis=1)
    
    my_list
    

    输出:

    array([[  1, 101],
           [  2, 120],
           [  3, 150],
           [  4, 191],
           [  5,  99]])
    

    时间安排:

    %timeit my_list[:,1] = np.where(np.isin(my_list[:,0],input_list), my_list[:,1]+1, my_list[:,1])
    14.6 µs ± 199 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit my_list[:,1] += np.logical_or.reduce(my_list[:,0,None] == input_list, axis=1)
    4.94 µs ± 23.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2020-07-14
      • 2022-11-16
      • 2011-11-23
      • 1970-01-01
      相关资源
      最近更新 更多