【问题标题】:Numpy - add row to arrayNumpy - 将行添加到数组
【发布时间】:2011-04-22 08:10:18
【问题描述】:

如何将行添加到 numpy 数组中?

我有一个数组 A:

A = array([[0, 1, 2], [0, 2, 0]])

如果 X 中每一行的第一个元素满足特定条件,我希望从另一个数组 X 向该数组添加行。

Numpy 数组没有像列表那样的“附加”方法,或者看起来是这样。

如果 A 和 X 是列表,我只会这样做:

for i in X:
    if i[0] < 3:
        A.append(i)

有没有 numpythonic 方法可以做到这一点?

谢谢, S ;-)

【问题讨论】:

标签: python arrays numpy rows


【解决方案1】:

你可以这样做:

newrow = [1, 2, 3]
A = numpy.vstack([A, newrow])

【讨论】:

  • @Kris 为什么不推荐使用它?我在docs 中什么也没看到
  • @Georgy 老实说,我不知道。我在这里寻找与您相同的答案:-)。我现在不记得为什么我写了上面的评论。我一定在文档中看到它已被弃用。但是现在看文档......它并没有这么说。有没有可能他们弃用了它,然后又改变了主意,并认为太多人觉得弃用和删除它太烦人了?
【解决方案2】:

X 是什么?如果它是一个二维数组,那么如何将它的行与一个数字进行比较:i &lt; 3

在 OP 评论后编辑:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

添加到A 中来自X 的所有行,其中第一个元素&lt; 3

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

【讨论】:

  • 对不起,好点!假设一个二维数组,每行的第一个元素必须满足一个条件。我会编辑那个。谢谢,S ;-)
  • @DarrenJ.Fitzpatrick 请记住,通过执行此类操作,您会与 Numpy 在为现有数组 A 预分配内存方面所做的出色工作相悖。显然,对于这个答案中的小问题,这不是问题,但对于大数据来说可能会更麻烦。
【解决方案3】:

由于这个问题是 7 年前提出的,在我使用的最新版本是 numpy 版本 1.13 和 python3 中,我正在做同样的事情,向矩阵添加一行,记得放一个 double括号到第二个参数,否则会引发尺寸错误。

在这里我在矩阵 A 上添加

1 2 3
4 5 6

一行

7 8 9

np.r_ 中的用法相同

A = [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

只是对某人感兴趣,如果您想添加一个列,

array = np.c_[A,np.zeros(#A's row size)]

按照我们之前对矩阵 A 所做的操作,向其添加一列

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

如果你想前置,你可以翻转参数的顺序,即:

np.r_([[7, 8, 9]], A)

    >> array([[7, 8, 9],
             [1, 2, 3],
             [4, 5, 6]])

【讨论】:

    【解决方案4】:

    如果在每一行之后都不需要计算,那么在 python 中添加行,然后转换为 numpy.以下是使用 python 3.6 与 numpy 1.14 的时序测试,一次添加 100 行:

    import numpy as np 
    from time import perf_counter, sleep
    
    def time_it():
        # Compare performance of two methods for adding rows to numpy array
        py_array = [[0, 1, 2], [0, 2, 0]]
        py_row = [4, 5, 6]
        numpy_array = np.array(py_array)
        numpy_row = np.array([4,5,6])
        n_loops = 100
    
        start_clock = perf_counter()
        for count in range(0, n_loops):
           numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
        duration = perf_counter() - start_clock
        print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    
        start_clock = perf_counter()
        for count in range(0, n_loops):
            py_array.append(py_row) # .15 micros
        numpy_array = np.array(py_array) # 43.9 micros       
        duration = perf_counter() - start_clock
        print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
        sleep(15)
    
    #time_it() prints:
    
    numpy 1.14 takes 5.971 micros per row
    python 3.6 takes 0.694 micros per row
    

    因此,从七年前开始,原始问题的简单解决方案是在将行转换为 numpy 数组后使用 vstack() 添加新行。但更现实的解决方案应该考虑 vstack 在这些情况下的糟糕性能。如果您不需要在每次添加后对数组运行数据分析,最好将新行缓冲到 python 行列表(实际上是列表列表),并将它们作为一个组添加到 numpy 数组在进行任何数据分析之前使用 vstack()。

    【讨论】:

      【解决方案5】:

      您也可以这样做:

      newrow = [1,2,3]
      A = numpy.concatenate((A,newrow))
      

      【讨论】:

      • 嗯。当我尝试这个时,它只是添加到 A 的末尾,而不是按照 OP 的要求添加一个新行。
      • 可能是np.concatenate((A,newrow), axis=0)
      • 从 numpy 版本 1.12.1(和 Python 3 中)开始,似乎试图将向量连接到矩阵引发 ValueError: all the input arrays must have same number of dimensions。看起来它希望在愿意连接之前将向量显式重塑为列或行向量。
      • @MRule 您可以根据@Flora PJ Li stackoverflow.com/a/47845065/1410035 的回答使用方括号来解决这个问题。 newrow = [[1,2,3]]
      【解决方案6】:
      import numpy as np
      array_ = np.array([[1,2,3]])
      add_row = np.array([[4,5,6]])
      
      array_ = np.concatenate((array_, add_row), axis=0)
      

      【讨论】:

        【解决方案7】:

        我使用更快的'np.vstack',例如:

        import numpy as np
        
        input_array=np.array([1,2,3])
        new_row= np.array([4,5,6])
        
        new_array=np.vstack([input_array, new_row])
        

        【讨论】:

          【解决方案8】:

          如果您可以在单个操作中完成构建,那么类似 vstack-with-fancy-indexing 的答案是一种很好的方法。但是,如果您的情况更复杂,或者您的行是即时出现的,您可能需要增加数组。事实上,做这样的事情的 numpythonic 方法——动态增长一个数组——是动态增长一个列表:

          A = np.array([[1,2,3],[4,5,6]])
          Alist = [r for r in A]
          for i in range(100):
              newrow = np.arange(3)+i
              if i%5:
                  Alist.append(newrow)
          A = np.array(Alist)
          del Alist
          

          列表针对这种访问模式进行了高度优化;您在列表形式中没有方便的 numpy 多维索引,但只要您要追加,就很难比行数组列表做得更好。

          【讨论】:

            【解决方案9】:

            您可以使用numpy.append() 将一行追加到 numty 数组中,然后再整形为矩阵。

            import numpy as np
            a = np.array([1,2])
            a = np.append(a, [3,4])
            print a
            # [1,2,3,4]
            # in your example
            A = [1,2]
            for row in X:
                A = np.append(A, row)
            

            【讨论】:

            • 由于在添加过程中改变了数组形状,因此添加行并不是真正的解决方案。
            【解决方案10】:

            我使用numpy.insert(arr, i, the_object_to_be_added, axis) 以便在第i 行(axis=0) 或列(axis=1) 插入object_to_be_added

            import numpy as np
            
            a = np.array([[1, 2, 3], [5, 4, 6]])
            # array([[1, 2, 3],
            #        [5, 4, 6]])
            
            np.insert(a, 1, [55, 66], axis=1)
            # array([[ 1, 55,  2,  3],
            #        [ 5, 66,  4,  6]])
            
            np.insert(a, 2, [50, 60, 70], axis=0)
            # array([[ 1,  2,  3],
            #        [ 5,  4,  6],
            #        [50, 60, 70]])
            

            太老的讨论了,但我希望它对某人有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-21
              • 2011-02-10
              • 2010-12-26
              • 2014-03-05
              • 2017-12-27
              • 2012-08-26
              • 1970-01-01
              相关资源
              最近更新 更多