如何将项添加到numpy数组中

时间:2011-02-21 10:29:33

标签: python numpy

我需要完成以下任务:

从:

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

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

这样的东西

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

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

7 个答案:

答案 0 :(得分:124)

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

那就是说,这通常是不可避免的,而这样做的功能是:

用于二维数组:

用于3-D阵列(以上加号):

用于N-D阵列:

答案 1 :(得分:13)

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

答案 2 :(得分:7)

一种方法(可能不是最好的方法)是使用新元素创建另一个数组并执行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]])

答案 3 :(得分:4)

通过将标量扩展为python-list-type,可以更简单地添加单个标量(并且也可以不转换为float):

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

答案 4 :(得分:1)

如果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.]])

答案 5 :(得分:1)

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

答案 6 :(得分:-1)

target = []

for line in a.tolist():
    new_line = line.append(X)
    target.append(new_line)

return array(target)