2 回答

TA貢獻1802條經驗 獲得超6個贊
怎么樣 首先獲取您擁有的布爾數組:
In [11]: a
Out[11]: array([0, 0, 0, 2, 2, 0, 2, 2, 2, 0])
In [12]: a1 = a > 1
使用以下命令將其向左移動一個(以獲取每個索引的下一個狀態)roll:
In [13]: a1_rshifted = np.roll(a1, 1)
In [14]: starts = a1 & ~a1_rshifted # it's True but the previous isn't
In [15]: ends = ~a1 & a1_rshifted
如果非零,則是每個True批次的開始(或分別是結束批次):
In [16]: np.nonzero(starts)[0], np.nonzero(ends)[0]
Out[16]: (array([3, 6]), array([5, 9]))
并將它們壓縮在一起:
In [17]: zip(np.nonzero(starts)[0], np.nonzero(ends)[0])
Out[17]: [(3, 5), (6, 9)]

TA貢獻1827條經驗 獲得超8個贊
如果您有權訪問scipy庫:
您可以使用scipy.ndimage.measurements.label標識任何非零值區域。它返回一個數組,其中每個元素的值是原始數組中某個范圍或范圍的ID。
然后,您可以使用scipy.ndimage.measurements.find_objects返回提取這些范圍所需的切片。您可以直接從這些片訪問開始/結束值。
在您的示例中:
from numpy import array
from scipy.ndimage.measurements import label, find_objects
data = numpy.array([0, 0, 0, 2, 2, 0, 2, 2, 2, 0])
labels, number_of_regions = label(a)
ranges = find_objects(labels)
for identified_range in ranges:
print identified_range[0].start, identified_range[0].stop
您應該看到:
3 5
6 9
希望這可以幫助!
添加回答
舉報