numpy数组如何在开头添加元素?

103

我有以下的numpy数组

import numpy as np

X = np.array([[5.], [4.], [3.], [2.], [1.]])

我想在开头插入[6.]。 我尝试过:

X = X.insert(X, 0)

如何往X中插入内容?

5个回答

129

numpy有一个insert函数,可以通过np.insert进行访问,具有文档

在这种情况下,您需要像这样使用它:

X = np.insert(X, 0, 6., axis=0)

第一个参数X指定要插入的对象。

第二个参数0指定位置。

第三个参数6.指定要插入的内容。

第四个参数axis=0指定在每列的位置0进行插入。我们也可以选择行,但因为X是列向量,所以我觉得保持一致性更好。


np.insert将使用新值替换对象。我有什么遗漏吗? - Shiang Hoo
1
可能是我的编译器出了问题... np.insert现在无法替换元素... - Shiang Hoo
关于axis=0的更多信息,请参见https://medium.com/@panjeh/numpy-insert-prepend-element-to-numpy-array-with-axis-parameter-875296ed87af - panjeh

65
我刚刚写了一些代码,需要进行大约100,000次操作,因此我需要找出最快的方法。虽然我不是代码效率方面的专家,但我可以通过在jupyter笔记本中使用“%%timeit”魔术函数来弄清楚一些事情。
我的发现: np.concatenate(([number],array))需要的时间最少。我们称它为1x时间。
np.asarray([number] + list(array))需要的时间约为2倍。 np.r_[number,array]需要的时间约为4倍。
np.insert(array,0,number)似乎是最糟糕的选项,在这里需要8倍时间。
我不知道这会随着数组大小(我使用一个形状为(15,)的数组)而改变,并且我提出的大多数选项仅适用于您想将该数字放在开头的情况。然而,由于问题正在询问这个问题,我认为这是一个进行这些比较的好地方。

2
太棒了!不仅第一种选项更快,而且可以轻松地用于插入整个序列...例如,在我的情况下,我想在开头插入几个零;aa =np.concatenate(([0]*99, aa))...因为我在平滑之前操作信号,然后找到峰值。 - Mohd

6
您可以尝试以下方法:
X = np.append(arr = np.array([[6]]), values = X, axis= 0)

不要将6插入到现有的X中,而是将6附加在X后面。

因此,第一个参数 arr 是标量6的numpy数组,第二个参数是要添加的数组,第三个参数是我们想要添加的位置


1

我知道这是一个相当古老的问题,但一个简短的解决方案是使用numpy切片技巧:

np.r_[[[6.]], X]

如果您需要在二维中执行此操作,可以使用np.c_。 我认为这是我能想到的最简洁版本。

顺便说一句:当然,您也可以通过简单地颠倒顺序来附加这种方式。 - T0eJam

0
arr = np.random.rand(1000000)
%timeit np.concatenate(([-1],arr))
1.33 ms ± 23.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

arr = np.random.rand(1000000)
%timeit np.asarray([-1] + list(arr))
63.7 ms ± 691 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

arr = np.random.rand(1000000)
%timeit np.r_[-1,arr]
1.41 ms ± 35.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

arr = np.random.rand(1000000)
%timeit np.insert(arr,0,-1)
1.39 ms ± 24.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

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