在numpy中向数组添加单个元素

203 投票
9 回答
557195 浏览
提问于 2025-04-17 01:39

我有一个包含以下内容的numpy数组:

[1, 2, 3]

我想创建一个包含以下内容的数组:

[1, 2, 3, 1]

也就是说,我想把第一个元素加到数组的末尾。

我试过一些简单的方法:

np.concatenate((a, a[0]))

但是我遇到了一个错误,提示 ValueError: arrays must have same number of dimensions

我不明白这个错误 - 这两个数组都是一维的。

9 个回答

18

试试这个:

np.concatenate((a, np.array([a[0]])))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

要使用concatenate这个功能,两个元素都必须是numpy数组;但是,a[0]并不是一个数组。这就是为什么它不工作的原因。

57

如果你只是偶尔添加数据,使用 np.append 来处理你的数组是可以的。不过,这种方法的缺点是每次调用的时候,都会为一个全新的数组分配内存。如果你需要添加很多数据,最好是提前分配好数组的大小(如果你知道总共需要多大),或者先把数据添加到一个列表里,最后再转换成数组。

使用 np.append 的例子:

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

使用 Python 列表,最后再转换成数组的例子:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

提前分配 numpy 数组的例子:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

如果最终的大小不确定,提前分配就比较困难。我试过每次分配 50 个的块,但效果远不如使用列表。

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
261

append() 是一个用来创建新数组的方法,这个新数组可以是把旧数组和新加的元素合在一起的结果。

我觉得用正确的方法来添加元素是更常见的做法:

a = numpy.append(a, a[0])

撰写回答