【问题标题】:How to add items into a numpy array如何将项目添加到numpy数组中
【发布时间】:2011-07-01 04:36:40
【问题描述】:

我需要完成以下任务:

来自:

a = array([[1,3,4],[1,2,3]...[1,2,1]])

(每行添加一个元素)到:

a = array([[1,3,4,x],[1,2,3,x]...[1,2,1,x]])

我尝试过类似 a[n] = array([1,3,4,x])

但 numpy 抱怨形状不匹配。我尝试遍历 a 并将元素 x 附加到每个项目,但未反映更改。

关于如何实现这一点的任何想法?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    将数据附加到现有数组是任何有 Python 经验的人都想做的事情。但是,如果您发现自己经常附加到大型数组,您会很快发现 NumPy 不会像 python list 那样轻松或有效地做到这一点。您会发现每个“追加”操作都需要重新分配数组内存和短期加倍内存需求。因此,该问题的更通用解决方案是尝试将数组分配为与算法的最终输出一样大。然后对该数组的子集 (slices) 执行所有操作。理想情况下,应尽量减少数组的创建和销毁。

    也就是说,这通常是不可避免的,执行此操作的函数是:

    对于二维数组:

    对于 3-D 数组(以上加号):

    对于 N 维数组:

    【讨论】:

    • 还值得一提的是快捷索引技巧c_和h_
    • hstack() 和 vstack() 是我需要的。
    • @wim。还有r_,这是我个人最常用的,因为它允许在标量中连接。
    【解决方案2】:
    import numpy as np
    a = np.array([[1,3,4],[1,2,3],[1,2,1]])
    b = np.array([10,20,30])
    c = np.hstack((a, np.atleast_2d(b).T))
    

    返回c:

    array([[ 1,  3,  4, 10],
           [ 1,  2,  3, 20],
           [ 1,  2,  1, 30]])
    

    【讨论】:

      【解决方案3】:

      一种方法(可能不是最好的)是使用新元素创建另一个数组并执行 column_stack。即

      >>>a = array([[1,3,4],[1,2,3]...[1,2,1]])
      [[1 3 4]
       [1 2 3]
       [1 2 1]]
      
      >>>b = array([1,2,3])
      >>>column_stack((a,b))
      array([[1, 3, 4, 1],
             [1, 2, 3, 2],
             [1, 2, 1, 3]])
      

      【讨论】:

        【解决方案4】:

        通过将标量扩展为 python-list-type,可以更容易地添加单个标量(并且也无需转换为浮点数):

        import numpy as np
        a = np.array([[1,3,4],[1,2,3],[1,2,1]])
        x = 10
        
        b = np.hstack ((a, [[x]] * len (a) ))
        

        返回 b 为:

        array([[ 1,  3,  4, 10],
               [ 1,  2,  3, 10],
               [ 1,  2,  1, 10]])
        

        追加一行可以通过:

        c = np.vstack ((a, [x] * len (a[0]) ))
        

        返回c

        array([[ 1,  3,  4],
               [ 1,  2,  3],
               [ 1,  2,  1],
               [10, 10, 10]])
        

        【讨论】:

          【解决方案5】:

          如果x 只是一个标量值,您可以尝试这样的方法来确保附加/连接到a 最右边一列的数组的正确形状:

          import numpy as np
          a = np.array([[1,3,4],[1,2,3],[1,2,1]])
          x = 10
          b = np.hstack((a,x*np.ones((a.shape[0],1))))
          

          返回 b 为:

          array([[  1.,   3.,   4.,  10.],
                 [  1.,   2.,   3.,  10.],
                 [  1.,   2.,   1.,  10.]])
          

          【讨论】:

            【解决方案6】:

            np.insert也可以用于目的

            import numpy as np
            a = np.array([[1, 3, 4],
                          [1, 2, 3],
                          [1, 2, 1]])
            x = 5
            index = 3 # the position for x to be inserted before
            np.insert(a, index, x, axis=1)
            
            array([[1, 3, 4, 5],
                   [1, 2, 3, 5],
                   [1, 2, 1, 5]])
            

            index也可以是list/tuple

            >>> index = [1, 1, 3] # equivalently (1, 1, 3)
            >>> np.insert(a, index, x, axis=1)
            array([[1, 5, 5, 3, 4, 5],
                   [1, 5, 5, 2, 3, 5],
                   [1, 5, 5, 2, 1, 5]])
            

            slice

            >>> index = slice(0, 3)
            >>> np.insert(a, index, x, axis=1)
            array([[5, 1, 5, 3, 5, 4],
                   [5, 1, 5, 2, 5, 3],
                   [5, 1, 5, 2, 5, 1]])
            

            【讨论】:

              【解决方案7】:
              target = []
              
              for line in a.tolist():
                  new_line = line.append(X)
                  target.append(new_line)
              
              return array(target)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-09-12
                • 1970-01-01
                • 2018-04-25
                • 1970-01-01
                • 2015-06-12
                • 1970-01-01
                • 2010-11-24
                相关资源
                最近更新 更多