Numpy - 向数组添加行

Dar*_*ick 146 python arrays numpy rows

如何将行添加到numpy数组?

我有一个数组A:

A = array([[0, 1, 2], [0, 2, 0]])
Run Code Online (Sandbox Code Playgroud)

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

Numpy数组没有像列表那样的"附加"方法,或者看起来如此.

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

for i in X:
    if i[0] < 3:
        A.append(i)
Run Code Online (Sandbox Code Playgroud)

是否有一种相似的方式?

谢谢,S ;-)

jkn*_*air 151

你能做到这一点:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])
Run Code Online (Sandbox Code Playgroud)

  • @Kris为什么不推荐使用?我在[docs]中什么都看不到(https://docs.scipy.org/doc/numpy/reference/genic/numpy.vstack.html) (2认同)

eum*_*iro 106

什么是X?如果它是2D数组,那么如何将其行与数字进行比较:i < 3

OP评论后编辑:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])
Run Code Online (Sandbox Code Playgroud)

添加到第一个元素所在的A所有行:X< 3

A = vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])
Run Code Online (Sandbox Code Playgroud)

  • @ DarrenJ.Fitzpatrick请记住,通过这种类型的操作,你可以反对Numpy在为现有数组"A"预先分配内存方面所做的出色工作.很明显,对于像这个答案这样的小问题,这不是问题,但对于大数据来说可能更麻烦. (2认同)

Flo*_* Li 23

由于这个问题已经存在了7年,在我使用的最新版本中是numpy版本1.13和python3,我在向矩阵添加一行时做同样的事情,记得给第二个参数添加一个双括号,否则,会引起尺寸误差.相同的用法np.r_

1 2 3
4 5 6
Run Code Online (Sandbox Code Playgroud)

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

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


小智 8

你也可以这样做:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))
Run Code Online (Sandbox Code Playgroud)

  • 可能是`np.concatenate((A,newrow),axis = 0)` (12认同)
  • 嗯。当我尝试这个时,它只是添加到 A 的末尾,而不是按照 OP 的要求添加一个新行。 (2认同)
  • 从numpy版本`1.12.1`(以及Python 3)开始,似乎尝试将向量连接到矩阵会引发`ValueError:所有输入数组必须具有相同数量的维度.看起来它希望在它愿意连接它之前将向量显式地重新整形为列或行向量. (2认同)
  • 根据@Flora PJ Li /sf/answers/3349154581/的回答,你可以使用双方括号修复@MRule.`newrow = [[1,2,3]]` (2认同)

rba*_*ham 6

如果每行之后都不需要进行计算,则在python中添加行然后转换为numpy更快。以下是使用python 3.6和numpy 1.14进行的时序测试,添加了100行,一次添加一行:

import numpy as py
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
Run Code Online (Sandbox Code Playgroud)

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


nam*_*994 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)
Run Code Online (Sandbox Code Playgroud)