Как разделить массив numpy везде, где меняются элементы

#python #numpy

#python #numpy

Вопрос:

Как вы можете разделить массив numpy любого типа данных везде, где изменяется последовательность. Примеры входных данных и желаемых результатов ниже:

 # Inputs
a = np.array([1,2,3,3,3,4,4,5,6,7,7,8,8,9])
b = np.array(["a","b","c","c","c","d","d","e","f","g","g","h","h","i"])
# Desired outputs
a:
[[1], [2], [3, 3, 3], [4, 4], [5], [6], [7, 7], [8, 8], [9]]
b:
[['a'],['b'],['c', 'c', 'c', 'c'],['d', 'd'],['e'],['f'],['g', 'g'],['h', 'h'],['i']]
  

Ответ №1:

Поскольку ваш вывод состоит из списков разного размера, он не может быть полностью функциональным массивом numpy. Затем вам нужно использовать приемы Python:

 from itertools import groupby
[list(g) for k, g in groupby(a)]
[list(g) for k, g in groupby(b)]
  

Если скорость также имеет значение, используйте a=a.tolist() и b=b.tolist() перед группировкой.

Ответ №2:

Вот пример того, как это сделать:

 def consecutive_split(data: np.ndarray):
    b = np.roll(data,1)    
    return np.split(data,np.where((data!=b)[1:])[0] 1)