假设我有一个 numpy.array
值,例如
values = np.array([0, 3, 2, 4, 6])
和一个 numpy.array
索引,比如说
idces = np.array([1, 3, 5])
。
我想获得一个数组,该数组在 idces 的位置上具有给定值,例如 -1
,而其他元素分布在其余位置。所以在上面的例子中我想获得
np.array([0, -1, 3, -1, 2, -1, 4, 6])
。
这看起来像 np.insert
的任务,只不过后者在指定索引处的值之前插入值,而不是在处> 指定的索引(只有当只有一个索引时两者才重合)。
所以我能想到的最好的办法是
np.insert(values, idces - np.arange(len(idces)), -1)
。
这仍然比使用 -np.ones
创建数组,计算 idces
的索引,然后使用 np.put
更好...但我想知道:有没有更干净的方法?
最佳答案
插入最好根据偏移来考虑,它枚举的不是数组元素,而是它们之间(或之前/之后)的间隙:
np.insert
的文档将其描述为“在其之前插入值的一个或多个索引”,这只是近似正确的。偏移量可以等于 len(arr)
(数组末尾)即使 arr[len(arr)]
抛出越界错误。
例如,np.insert([3, 1, 4, 1, 5], [1, 3, 3, 5], [0, 0, 0, 0])
意思是:在编号为 1 的间隙处放置一个零,在编号为 3 的间隙处放置另外两个零,最后一个在末尾。结果是[3, 0, 1, 4, 0, 0, 1, 5, 0]
。
与指定新元素的插入后索引相比,此枚举的一些优点:
1) 在一个地方插入一堆元素更容易:np.insert(arr, [3]*values.size, values)
插入数组 values
在第三个偏移处。
2) 使用 np.insert(arr, np.arange(values.size), values)
交错两个数组更容易
3) 更容易控制插入点是否有效;有效性并不取决于插入的元素数量。
当您知道插入后索引时的情况idces
很容易处理,就像您对
np.insert(values, idces - np.arange(len(idces)), -1)
关于python - 在 numpy 数组中的特定位置插入值(np.insert 做对了吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442115/