【问题标题】:Replace values in array of indexes corresponding to another array替换对应于另一个数组的索引数组中的值
【发布时间】:2019-07-02 19:43:53
【问题描述】:

我有一个大小为[1, x] 的值数组A 和一个大小为[1, y] (y > x) 的索引数组A。我想要一个大小为[1,y] 的数组C 填充A 的值。

这是输入和输出的示例:

>>> A = [6, 7, 8]
>>> B = [0, 2, 0, 0, 1]
>>> C = #Some operations
>>> C
[6, 8, 6, 6, 7]

当然可以这样解决:

>>> C = []
>>> for val in B:
>>>     C.append(A[val])

但实际上,我希望有更好的方法来做到这一点。特别是因为我想将它用作另一个函数的参数。一个看起来像A[B](但可以工作的)的表达式将是理想的。我不介意使用 NumPy 或 pandas 的解决方案。

【问题讨论】:

    标签: python arrays list numpy


    【解决方案1】:

    简单的列表理解:

    A = [6, 7, 8]
    B = [0, 2, 0, 0, 1]
    
    C = [A[i] for i in B]
    print(C)
    

    这会产生

    [6, 8, 6, 6, 7]
    

    【讨论】:

      【解决方案2】:

      对于获取多个项目operator.itemgetter 派上用场:

      from operator import itemgetter
      A = [6, 7, 8]
      B = [0, 2, 0, 0, 1]
      
      itemgetter(*B)(A)
      # (6, 8, 6, 6, 7)
      

      正如你提到的numpy,这可以通过索引你指定的数组直接完成,即A[B]

      import numpy as np
      A = np.array([6, 7, 8])
      B = np.array([0, 2, 0, 0, 1])
      
      A[B]
      # array([6, 8, 6, 6, 7])
      

      另一种选择是使用np.take

      np.take(A,B)
      # array([6, 8, 6, 6, 7])
      

      【讨论】:

        【解决方案3】:

        这是一种方法,使用 numpy ndarrays:

        import numpy as np
        
        A = [6, 7, 8]
        B = [0, 2, 0, 0, 1]
        C = list(np.array(A)[B]) # No need to convert B into an ndarray
                                 # list() is for converting ndarray back into a list,
                                 # (if that's what you finally want)
        print (C)
        

        说明

        1. 给定一个 numpy ndarray (np.array(A)),我们可以使用 整数数组(恰好是您的首选 解决方案的形式是):您用于的整数数组 索引到 ndarray,不必是另一个 ndarray。它甚至可以 成为一个列表,这也适合我们,因为B 恰好是一个列表。所以, 我们拥有的是:

          np.array(A)[B]
          
        2. 这种索引的结果将是另一个 ndarray,具有 与索引数组相同的形状(尺寸)。所以,在我们的例子中,作为 我们正在使用整数索引列表对 ndarray 进行索引,即 该索引的结果将是 与索引列表的长度相同。

        3. 最后,如果我们想转换上面的结果,从一个 一维ndarray返回到一个列表中,我们可以将它作为一个 list()的参数:

          list(np.array(A)[B])
          

        【讨论】:

          【解决方案4】:

          你可以通过列表理解来做到这一点:

          >>> A = [6, 7, 8]
          >>> B = [0, 2, 0, 0, 1]
          >>> C = [A[x] for x in B]
          >>> print(C)
          [6, 8, 6, 6, 7]
          

          【讨论】:

            【解决方案5】:

            我认为你需要一个生成器(列表理解):

            A = [1, 2, 3]
            B = [0, 2, 0, 0, 1]
            C = [A[i] for i in B]
            

            【讨论】:

            • 虽然你的答案是正确的,但请注意:生成器 列表理解。
            【解决方案6】:

            一旦你使用了numpy.array,你就可以用你期望的语法做你想做的事:

            >>> a = array([6, 7, 8])
            >>> b = array([0, 2, 0, 0, 1])
            >>> a[b]
            array([6, 8, 6, 6, 7])
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-21
              • 2016-11-27
              • 2015-03-24
              • 2016-10-22
              • 1970-01-01
              • 2021-01-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多