【发布时间】:2019-01-23 22:03:34
【问题描述】:
给定一个 3 维布尔数据:
np.random.seed(13)
bool_data = np.random.randint(2, size=(2,3,6))
>> bool_data
array([[[0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1]],
[[1, 0, 1, 1, 0, 0],
[0, 1, 1, 1, 1, 0],
[1, 1, 1, 0, 0, 0]]])
我希望计算每行(沿轴 = 1)中以两个 0 为界的连续 1 的数量,并返回一个带有计数的数组。对于bool_data,这将给出array([1, 1, 2, 4])。
由于bool_data 的 3D 结构和每行的可变计数,我不得不笨拙地将计数转换为嵌套列表,使用 itertools.chain 将它们展平,然后将列表反向转换为数组:
# count consecutive 1's bounded by two 0's
def count_consect_ones(input):
return np.diff(np.where(input==0)[0])-1
# run tallies across all rows in bool_data
consect_ones = []
for i in range(len(bool_data)):
for j in range(len(bool_data[i])):
res = count_consect_ones(bool_data[i, j])
consect_ones.append(list(res[res!=0]))
>> consect_ones
[[], [1, 1], [], [2], [4], []]
# combines nested lists
from itertools import chain
consect_ones_output = np.array(list(chain.from_iterable(consect_ones)))
>> consect_ones_output
array([1, 1, 2, 4])
有没有更有效或更聪明的方法来做到这一点?
【问题讨论】:
标签: python arrays loops numpy scipy