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

193

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

[1, 2, 3]
我想创建一个包含以下内容的数组:
[1, 2, 3, 1]

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

我已经尝试了显而易见的方法:

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

但是我得到了一个错误,错误提示为ValueError:arrays必须具有相同数量的维度

我不理解这个错误 - 这两个数组都只是1d数组。


2
np.insert([1,2,3], 3, 1) - Sparkler
9个回答

251

append()方法创建一个新的数组,该数组可以是旧数组加上被附加元素后的结果。

我认为使用适当的方法添加元素更为常规:

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

45
该命令不会改变数组 a 的内容,但会返回一个新的已修改数组。因此,如果需要修改 a 数组,则必须使用 a = numpy.append(a, a[0]) - Amjad
np.append 使用 np.concatenate。它只是确保添加的数组具有一个维度。OP 的错误在于 a[0] 没有任何维度。 - hpaulj
5
为什么如果我只想添加一个元素,使用 append 函数会创建一个全新的数组? - ed22
5
对于这么简单的命令,我不喜欢我们需要调用另一个函数。 如果数组本身有一个内部方法,如 a.append(1)a.add(1),甚至类似列表的 a + [1] ,那就更好了。 - Fernando Wittmann

55

当仅需要添加一次或偶尔添加时,使用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)

18

1
或者更简单地说,np.concatenate((a, [a[0]]))。该列表将自动升级为数组类型,无需手动输入,从而节省您的时间。 - Mad Physicist

16

这个命令,

numpy.append(a, a[0])

不会改变a数组,但是它会返回一个新的修改后的数组。 因此,如果需要修改a,则必须使用以下内容。

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

15

a[0] 不是数组,它是 a 的第一个元素,因此没有维度。

尝试使用 a[0:1],它将返回 a 的第一个元素,放在一个单独的数组内。


10
t = np.array([2, 3])
t = np.append(t, [4])

7

如果您想添加一个元素,请使用append()

在这种情况下,a = numpy.append(a, 1)将1添加到数组的末尾

如果您想插入一个元素,请使用insert()

在这种情况下,a = numpy.insert(a, index, 1)您可以使用索引设置元素在数组中的位置,从而将1放置在所需的位置。


3

可能有点过头了,但我总是使用np.take函数进行任何环绕索引:

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])

2
假设 a=[1,2,3],你想让它变成 [1,2,3,1]
你可以使用内置的 append 函数。
np.append(a,1)

这里的1是一个整数,它可能是一个字符串,也可能不属于数组中的元素。输出:[1,2,3,1]


欢迎来到StackOverflow!您可能想阅读此指南,了解如何格式化代码,然后更新您的答案,使其更易读 :) 此外,这是一个非常古老的问题,已有接受的答案,最好回答一些新问题。 - 0mpurdy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接