Поскольку вы имеете дело с одномерными массивами *, вы можете использовать широковещательную рассылку , чтобы сравнить ваш массив с его уникальными элементами и найти желаемые позиции.
In [68]: a = np.array ([0,1,1,1,3,3,5,1,2,3,6,9,10, 10, 9, 9])
In [69]: arr = np.unique(a)
In [70]: x, y= np.where(arr[:,None] == a)
In [71]: inds = np.where(x[:-1] - x[1:] != 0)[0] + 1
In [72]: np.split(y, inds)
Out[72]:
[array([0]),
array([1, 2, 3, 7]),
array([8]),
array([4, 5, 9]),
array([6]),
array([10]),
array([11, 14, 15]),
array([12, 13])]
Если действительно необходимо найти пропущенные элементы, хотя неясно, какова логика ожидаемого результата, но кажется, что вы находите индексы для всех элементов от a.min()
до a.max()
.В этом случае вы можете использовать np.arange(a.min(), a.max())
в качестве arr
, а затем поставить arr[:,None] == a
в маске, тогда вы можете найти индексы пропущенных предметов следующим образом:
In [115]: missed = np.where((~mask).all(1))[0]
In [116]: missed
Out[116]: array([4, 7, 8])
*Из документации : для 3-мерных массивов это, безусловно, эффективно с точки зрения строк кода, а для небольших наборов данных оно также может быть эффективным в вычислительном отношении.Однако для больших наборов данных создание большого трехмерного массива может привести к снижению производительности.Кроме того, широковещательная рассылка является мощным инструментом для написания короткого и обычно интуитивно понятного кода, который очень эффективно выполняет свои вычисления на языке C. Однако существуют случаи, когда широковещательная передача использует излишне большие объемы памяти для конкретного алгоритма.В этих случаях лучше написать внешний цикл алгоритма на Python.Это также может привести к получению более читабельного кода, поскольку алгоритмы, использующие широковещание, становятся все труднее интерпретировать по мере увеличения числа измерений в широковещании.