如何向numpy数组添加行?

我有一个数组A

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

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

Numpy数组不像列表那样有一个方法“append”,或者看起来是这样。

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

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

有没有一种numpythonic方法来做同样的事情?

谢谢, 年代;-)


当前回答

由于这个问题是7年前的问题,在我使用的最新版本是numpy版本1.13和python3中,我正在做同样的事情,向矩阵中添加一行,记住在第二个参数中放入双括号,否则,它将引发维度错误。

这里我对矩阵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]]]

如果有人感兴趣,如果你想增加一列,

数组= np.c_[A,np. c_]0 (#A的行大小)]

跟我们之前在矩阵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]])

其他回答

您可以使用numpy.append()将一行附加到numpty数组中,并稍后将其重塑为矩阵。

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)

如果每一行之后都不需要计算,那么在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

So, the simple solution to the original question, from seven years ago, is to use vstack() to add a new row after converting the row to a numpy array. But a more realistic solution should consider vstack's poor performance under those circumstances. If you don't need to run data analysis on the array after every addition, it is better to buffer the new rows to a python list of rows (a list of lists, really), and add them as a group to the numpy array using vstack() before doing any data analysis.

我使用numpy。插入(arr, i, the_object_to_be_added, axis),以便在第i行(轴=0)或第i列(轴=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]])

太旧的讨论了,但我希望它能帮助到一些人。

你还可以这样做:

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

由于这个问题是7年前的问题,在我使用的最新版本是numpy版本1.13和python3中,我正在做同样的事情,向矩阵中添加一行,记住在第二个参数中放入双括号,否则,它将引发维度错误。

这里我对矩阵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]]]

如果有人感兴趣,如果你想增加一列,

数组= np.c_[A,np. c_]0 (#A的行大小)]

跟我们之前在矩阵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]])