使用zip和np.insert

时间:2017-01-13 21:44:23

标签: python arrays numpy indexing zip

我删掉了一个numpy数组的零,做了一些东西,并希望以视觉目的插回它们。我确实有段的索引,并试图用numpy.insert和zip插入零,但索引运行超出范围,即使我从较低端开始。例如:

import numpy as np

a = np.array([1, 2, 4, 0, 0, 0, 3, 6, 2, 0, 0, 1, 3, 0, 0, 0, 5])
a = a[a != 0]  # cut zeros out
zero_start = [3, 9, 13]
zero_end = [5, 10, 15]

# Now insert the zeros back in using the former indices
for ev in zip(zero_start, zero_end):
    a = np.insert(a, ev[0], np.zeros(ev[1]-ev[0]))

>>> IndexError: index 13 is out of bounds for axis 0 with size 12

好像他没有刷新循环内的数组大小。任何建议或其他(更多pythonic)方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

方法#1:使用indexing -

# Get all zero indices
idx = np.concatenate([range(i,j+1) for i,j in zip(zero_start,zero_end)])

# Setup output array of zeros
N = len(idx) + len(a)
out = np.zeros(N,dtype=a.dtype)

# Get mask of non-zero places and assign values from a into those
out[~np.in1d(np.arange(N),idx)] = a

我们还可以生成a最初具有非零值的实际索引,然后分配。因此,屏蔽的最后一步可以用这样的东西代替 -

out[np.setdiff1d(np.arange(N),idx)] = a

方法#2:使用zero_start作为数组zero_endinsert_start = np.r_[zero_start[0], zero_start[1:] - zero_end[:-1]-1].cumsum() out = np.insert(a, np.repeat(insert_start, zero_end - zero_start + 1), 0)

In [755]: a = np.array([1, 2, 4, 0, 0, 0, 3, 6, 2, 0, 0, 1, 3, 0, 0, 0, 5])
     ...: a = a[a != 0]  # cut zeros out
     ...: zero_start = np.array([3, 9, 13])
     ...: zero_end = np.array([5, 10, 15])
     ...: 

In [756]: s0 = np.r_[zero_start[0], zero_start[1:] - zero_end[:-1]-1].cumsum()

In [757]: np.insert(a, np.repeat(s0, zero_end - zero_start + 1), 0)
Out[757]: array([1, 2, 4, 0, 0, 0, 3, 6, 2, 0, 0, 1, 3, 0, 0, 0, 5])

示例运行 -

git rm file