合并和拆分布尔数组

时间:2017-10-27 17:31:29

标签: python arrays numpy boolean

我有一个使用numpy where函数构造的布尔数组列表,例如:

A[0] = [False, False, True, True, True, False, False,False,False,False]
A[1] = [False, False, False, False,False,False, True, True, True,False]
A[2] = [False,True, True, True, False, False, False, False,False,False]
...

一些注意事项:

  • 真正的数组有类似10 000个元素
  • 有几个" true"每个阵列上的窗口
  • " true"窗口可能会从数组重叠到数组
  • 所有数组都具有相同的长度 L

我需要:

1)将所有数组合并为一个长度为 L 的单个数组,该数组将包含所有" True"值

2)恢复每个" True"窗口的主题和最终索引

任何想法?

谢谢!

修改

预期结果是:     R = [假,真,真,真,真,假,真,真,真,假]

就代码而言:

import numpy as np

data = np.arange(1,100)

list_of_lists = [[5,10], [15,25], [45,85]]

A = [np.where((data < list[1]) & (data > list[0]))[0] for list in list_of_lists]

输出:

 >>> print A
 [array([5, 6, 7, 8]), array([15, 16, 17, 18, 19, 20, 21, 22, 23]), array([45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
   62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
   79, 80, 81, 82, 83])]

期望的结果:

 R = [[5,8],[15,23],[45,83]]

2 个答案:

答案 0 :(得分:0)

当你说“将所有数组合并为一个长度为L且将包含所有”True“值的单个数组时,我不确定你的意思。然而,第二项,恢复所有真实窗口的初始和最终索引是有趣的:

A = []
A.append([False,False,True, True, True, False,False,False,False,False])
A.append([False,False,False,False,True, True, True, False,False,False])
A.append([False,True, True, True, False,False,False,False,False,False])

r =      [False,True, True, True, True, True, True, False,False,False]
# r is the desired result, with start index of 1 and end index of 6

L = len(A[0])
W = []

start = True
w = set()
for i in range(L):
    if start: # beginning of window
        for a in A:  
            if a[i] is True:  # found the start of the window
                w.add(i)      # mark it
                start = False # start looking for the end of the window
                break
    else:
        end = True # until proven otherwise
        for a in A:
            if a[i] is True:  # nope, not the end, keep looking
                end = False   # proof
                break
        if end is True:  # all false, this is the end
            w.add(i-1)   # mark it
            W.append(w)  # save it
            w = set()    # start over
            start = True

print (W) 

答案 1 :(得分:0)

让我们首先将您的示例简化为两个sub-arrays之间存在重叠的情况。

a = np.array([[False, False, True, True], [True, False, False, False]])

因此,根据我从问题中收集的内容,预期的output将是:

[array([1, 4])]

因为这是"True"窗口的开头和结尾(indexes 14)。

要实现此结果,我们需要先flatten a才能1-dimensional array concatenated sub-arrays。这是通过a.flatten()完成的。这给出了:

array([False, False,  True,  True,  True, False, False, False], dtype=bool)

现在,我们需要找到indexes翻转value所在的state(即True --> FalseFalse --> True)。要执行此操作,我们可以将array a.flatten() first element arraya.flatten()的{​​{1}}进行比较,而不{{1} }} last。然后在element上使用np.where来获得boolean array indexes次更改。

N.B。上述技术最初来自this answer` @Kith。

为了实现这一点,我们可以做到以下几点:

state

为我们提供np.where(a.flatten()[:-1] != a.flatten()[1:])[0] 更改indexes

state

实际上只有(array([1, 4], dtype=int32),) 更改的地方,因此在第一个state开始之前。

然后我们需要将此window分块到array。这是通过2s

完成的
np.split()

为我们提供了indexes = np.where(a.flatten()[:-1] != a.flatten()[1:])[0] windows = np.split(indexes, len(indexes) / 2) list arrays length 2 window,表示[array([1, 4], dtype=int32)] 的开头和结尾:

np.where