在numpy中向数组添加单个元素
我有一个包含以下内容的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])