假设我有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
的任务,除了后者在指定索引处的值之前插入值,而不是 at 指定的索引(只有当只有一个指数时,两者才重合。
所以我能想到的最好的是
np.insert(values, idces - np.arange(len(idces)), -1)
。
这比使用-np.ones
创建数组,计算idces
的索引然后使用np.put
更好......但我想知道:有更清洁的方法吗?
答案 0 :(得分:1)
最好根据偏移来考虑插入,它不会枚举数组元素,而是枚举它们之间(或之前/之后)的间隙:
np.insert
的文档将其描述为"插入值之前的索引或#34;这几乎是正确的。即使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)