条件为

时间:2018-05-27 11:43:14

标签: python numpy

我想在某些条件下从数组中创建块。 假设我想要所有非空的块。

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)?

2 个答案:

答案 0 :(得分:3)

尝试使用此尺寸:)

使用np.where过滤,np.diffnp.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])}