Numpy - 向数组添加行

时间:2010-10-07 12:09:14

标签: python arrays numpy rows

如何将行添加到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; - )

10 个答案:

答案 0 :(得分:138)

你可以做到这一点:

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

答案 1 :(得分:100)

什么是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]])

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]])

答案 2 :(得分:19)

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

中的相同用法
np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0)
>> array([[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]])

如果你想添加一个专栏,那就是对某人的兴趣

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

答案 3 :(得分:7)

你也可以这样做:

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

答案 4 :(得分:3)

我使用&#39; np.vstack&#39;哪个更快,EX:

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])

答案 5 :(得分:3)

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

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

答案 6 :(得分:2)

如果你可以在一次操作中进行构建,那么类似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

列表针对此类访问模式进行了高度优化;在列表形式中你没有方便的多维索引,但只要你附加它就比行数组列表更难做。

答案 7 :(得分:2)

您可以使用 $( "#target" ).keypress(function() { //your code }); 将一行附加到numpty数组,并稍后重新整形为矩阵。

numpy.append()

答案 8 :(得分:2)

array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

答案 9 :(得分:1)

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

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]])

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