Как вы удаляете массив numpy из списка массивов numpy?

Если у меня есть список массивов numpy, то использование метода remove возвращает ошибку значения.

Например:

import numpy as np

l = [np.array([1,1,1]),np.array([2,2,2]),np.array([3,3,3])]

l.remove(np.array([2,2,2]))

Дала бы мне

ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any() или a.all()

Я не могу заставить все() работать, это просто невозможно?

Ответ 1

Проблема заключается в том, что когда два массива numpy сравниваются с ==, как и в методах remove() и index(), возвращается массив numpy из логических значений (сравнения элементов по элементам), который интерпретируется как неоднозначный. Хорошим способом сравнения двух массивов numpy для равенства является использование функции numpy array_equal().

Так как метод remove() списков не имеет ключевого аргумента (например, sort()), я думаю, что вам нужно сделать свою собственную функцию для этого. Вот то, что я сделал:

def removearray(L,arr):
    ind = 0
    size = len(L)
    while ind != size and not np.array_equal(L[ind],arr):
        ind += 1
    if ind != size:
        L.pop(ind)
    else:
        raise ValueError('array not found in list.')

Если вам нужно, чтобы он был быстрее, вы могли бы Cython -ize его.

Ответ 2

Здесь вы идете:

list.pop(1)

Update:

list.pop(list.index(element))

Я не думаю, что вы можете обойти список, чтобы найти позицию элемента. Не беспокойтесь об этом. Python по умолчанию использует хороший алгоритм поиска, чтобы найти его, по крайней мере, для вас.