我想在numpy数组中插入零,但是以@Component
@ConfigurationProperties("validation")
public class ValidationConfig {
private Map<String, String> synonyms;
// ...
}
函数的工作方式不同。 numpy.insert
函数在给定索引的位置之前插入每个元素,而不关心同一插入中包含的其他元素。也就是说,给予函数的索引是指插入之前的位置。我想要一个在插入后考虑索引的函数。让我举个例子:
如果输入数组为numpy.insert
且索引为array(1, 2, 3, 4)
,则输出数组应为[2, 5]
。
这样做的非矢量化方法是:
array(1, 2, 0, 3, 4, 0)
我正在寻找一种矢量化的方法来做到这一点,但我找不到它。
答案 0 :(得分:1)
这是一个矢量化方法,它创建一个零数组并相应地替换项目:
In [99]: def insert(arr, ind):
...: new_size = arr.size + ind.size
...: new = np.zeros(new_size)
...: new[~np.in1d(np.arange(new_size), ind)] = arr
...: return new
演示:
In [100]: arr = np.array([1, 2, 3, 4])
In [101]: ind = np.array([2, 5])
In [102]:
In [102]: insert(arr, ind)
Out[102]: array([1., 2., 0., 3., 4., 0.])
答案 1 :(得分:1)
这是一种带屏蔽的矢量化方式 -
def insert_zeros(input_array, indices):
n = len(input_array) + len(indices)
mask = np.ones(n, dtype=bool)
mask[indices] = 0
out = mask.astype(input_array.dtype)
out[mask] = input_array
return out
示例运行 -
In [141]: input_array = np.array([1, 2, 3, 4])
...: indices = np.array([2, 5])
In [142]: insert_zeros(input_array, indices)
Out[142]: array([1, 2, 0, 3, 4, 0])
按照10,000x
对随机数字阵列的给定样本进行扩展,并为当前设置的时间设置和时间提供索引 -
In [150]: np.random.seed(0)
...: input_array = np.random.randint(0,9,(40000))
...: indices = np.sort(np.random.choice(range(len(input_array)), 20000, replace=0))
In [151]: %timeit insert(input_array, indices) # @Kasramvd's soln
...: %timeit insert_zeros(input_array, indices) # Posted in this soln
100 loops, best of 3: 4.58 ms per loop
1000 loops, best of 3: 280 µs per loop