我有一个使用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]
...
一些注意事项:
我需要:
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]]
答案 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
1
和4
)。
要实现此结果,我们需要先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 --> False
或False --> True
)。要执行此操作,我们可以将array
a.flatten()
first
element
array
与a.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