我想在某些条件下从数组中创建块。 假设我想要所有非空的块。
array = np.random.randint(2, size=10)
# array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])
out = chunks(array)
# array([[0,[1]],[4,[1, 1]],[8,[1]])
现在我知道第一个块开始索引0并包含[1]
0: 0 -> [1]
1: 4 -> [1,1]
2: 8 -> [1]
它不一定是这样的, 但我不知道更好。 到目前为止,我已经用for循环完成了它。 但每当我查看我的代码时,它都让我感到压抑:)。
有没有更好的方法(Numpy magic)?
答案 0 :(得分:3)
尝试使用此尺寸:)
使用np.where
过滤,np.diff
和np.split
对连续索引进行分组。
import numpy as np
array = np.array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])
idx_matching_1 = np.where(array == 1)[0]
consecutive_groups_of_1_idx = np.split(idx_matching_1, np.where(np.diff(idx_matching_1) != 1)[0] + 1)
print(consecutive_groups_of_1_idx)
[array([0]), array([4, 5]), array([8])]
答案 1 :(得分:2)
这是一种方式 -
def group_elems(a, nullval=0):
mask = a!=nullval
mask_ext = np.r_[False, mask, False]
idx = np.flatnonzero(mask_ext[1:] != mask_ext[:-1])
cut_idx = (idx[1::2] - idx[::2]).cumsum()
return dict(zip(idx[::2], np.split(a[mask], cut_idx[:-1])))
样品运行 -
In [62]: a = np.array([1, 0, 0, 0, 1, 1, 0, 0, 1, 0])
In [63]: group_elems(a, nullval=0)
Out[63]: {0: array([1]), 4: array([1, 1]), 8: array([1])}
In [64]: a = np.array([1, 0, 0, 0, 2, 3, 0, 0, 4, 0])
In [65]: group_elems(a, nullval=0)
Out[65]: {0: array([1]), 4: array([2, 3]), 8: array([4])}