如何将项目添加到numpy数组


73

我需要完成以下任务:

从:

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

我已经尝试做类似a [n] = array([1,3,4,x])的事情

但是numpy抱怨形状不匹配。我尝试遍历a并将元素x附加到每个项目,但是更改未反映出来。

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

Answers:


132

对于有python经验的人来说,将数据追加到现有数组是很自然的事情。但是,如果您发现自己定期附加到大型数组,则会很快发现NumPy不能像python那样轻松或有效地做到这一点list。您会发现,每个“追加”操作都需要重新分配阵列内存,并使内存需求短期增加一倍。因此,解决该问题的更通用的方法是尝试分配与算法最终输出一样大的数组。然后,对该数组的子集(切片)执行所有操作。理想情况下,应最小化阵列的创建和销毁。

就是说,这通常是不可避免的,执行此操作的功能是:

对于二维数组:

对于3-D阵列(上面加上):

对于ND阵列:


2
还值得一提的是快捷索引技巧C_和H_
WIM

我需要hstack()和vstack()。
kakyo 2015年

1
@wim。和r_,这是我个人最常使用的,因为它允许串联标量。
疯狂物理学家

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

8

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

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

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

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

-1
target = []

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

return array(target)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.