Функция удаления Python оптимизирована для первой проверки на идентичность, а затем для проверки на равенство.Таким образом, для alist.remove(item)
сначала проверяется item is alist[0]
(проверка идентичности, ищется место в памяти), а затем проверяется item == alist[0]
(проверка равенства, просматривается фактическое значение (я))
Однако для массивов с нулевыми значениямиравенство переопределяется с помощью numpy для возврата проверки каждого элемента.(Векторизованная проверка. np.array([1, 2]) == np.array([2, 2])
возвращает np.array([False, True])
.) Это не может быть обработано функцией удаления, потому что она ожидает только один логический тип.
Однако идентификация все еще работает для массивов с пустыми значениями.Итак, для вашего первого случая вам просто повезло, что именно первый элемент был точным.Во втором случае он должен был проверить несколько элементов, но в первый раз, когда он проверял равенство, после первоначальной проверки идентичности он получил вектор логических значений и не смог выдать «неоднозначную» ошибку.
В вашемВ конкретном случае я бы порекомендовал извлечь индекс для ваших операций, а затем использовать pop.
ind = min(range(len(centers)), key=lambda ind: sum(centers[ind]))
Для других людей лучше написать собственную функцию с циклом, проверяющим равенство самостоятельно, вместо того, чтобы по умолчанию использовать функцию равенства numpy.
РЕДАКТИРОВАТЬ:
В этом конкретном случае возможно и другое, более производительное решение с использованием (оптимизированных) встроенных функций numpy.
summed_centers = centers.sum(axis=1)
mask = np.ones(len(summed_centers), np.bool_)
mask[[summed_centers.argmax(), summed_centers.argmin()]] = np.bool_(False)
new_centers = centers[mask]
EDIT2:
Если вы не сделали этого сейчас, есть функция np.delete
, которая может делать то же самое, но без явного создания массива масок, но документация предпочламассив масок, потому что np.delete
всегда делает копию ваших данных.