如何在正确位置重新插入已删除的数组元素



我需要在数组中重新插入以前删除的元素。在这种情况下,我需要在修复一组参数的子集后,最小化一组参数上的损失函数。最小化器只取剩余的未固定子集,但我需要将整个参数集传递给要最小化的函数。

我曾想过使用带有要排除的元素索引的np.delete,然后使用np.insert以相同的逻辑撤消它,但以下操作是不起作用的,因为np.insert和np.deletes的操作方式不对称:

import numpy as np
pars = np.array([0,10,20,30,40,50])
exclude = [1,3] # index of elements to exclude
parsSubset = np.delete(pars,exclude)
excludedPars = pars[exclude]
parsRecreated = np.insert(parsSubset,exclude,excludedPars)
print(parsRecreated)

这种代码的输出是[ 0 10 20 40 30 50]

我在下面列出了我的解决方案,但我想知道是否有一个更优雅的解决方案我缺少

In [24]: pars = np.array([0,10,20,30,40,50])
...: exclude = [1,3] # index of elements to exclude
...: 
...: parsSubset = np.delete(pars,exclude)
In [25]: pars
Out[25]: array([ 0, 10, 20, 30, 40, 50])
In [26]: parsSubset
Out[26]: array([ 0, 20, 40, 50])
In [27]: np.insert(parsSubset,exclude,100)
Out[27]: array([  0, 100,  20,  40, 100,  50])

deletepars:中删除这些项目

In [33]: pars[exclude]
Out[33]: array([10, 30])

insertparsSubset:中的这些项目之前添加项目

In [34]: parsSubset[exclude]
Out[34]: array([20, 50])

insert相对于当前阵列而非目标阵列工作。在内部,它确实考虑到,一旦在20之前插入一个项,嵌套插入点就会移动。事实上,它的代码中有一行

indices[order] += np.arange(numnew)

我们可以用我们自己的减法来弥补这一点:

In [36]: np.insert(parsSubset,exclude-np.arange(2),100)
Out[36]: array([  0, 100,  20, 100,  40,  50])

内部deleteinsert是复杂的,因为它们可以使用不同的维度和不同类型的输入(标量、切片、序列(。但对于这样的序列,两者都可以像你一样使用掩码。你的解决方案没有错,而且很可能更快(没有一般开销(。

这是我的解决方案,创建一个掩码并使用它重新插入:

import numpy as np
pars = np.array([0,10,20,30,40,50])
exclude = [1,3] # index of elements to exclude
mask = np.array([True] * pars.size)
mask[exclude] = False
parsSubset = pars[mask] 
parsRecreated = np.zeros(pars.size)
parsRecreated[mask] = parsSubset
parsRecreated[~mask] = pars[~mask]
print(parsRecreated)

最新更新