numpy替代插入的矢量化实现

时间:2018-04-17 11:55:48

标签: python arrays numpy vectorization

我想在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)

我正在寻找一种矢量化的方法来做到这一点,但我找不到它。

2 个答案:

答案 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