Как добавить или удалить определенный элемент из массива 2d? - PullRequest
0 голосов
/ 22 февраля 2019

С учетом следующего массива:

arr = np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9]
])

удалить и вернуть:

arr = np.array([
    [1,2,3],
    [4,6],
    [7,8,9]
])

Я хочу удалить 5 из этого массива.или удалите только arr [1] [2].Когда я использую del arr[i][j], выдается следующее сообщение об ошибке.ValueError: cannot delete array elements и нудистская документация не ясна для меня.

Аналогично, как добавить элемент в несколько строк в одном массиве?

Если быть точным, то, когда я читаю изображение с помощью opencv, я получаю эту ошибку.

rgb_image = cv2.imread("image.png")

del операция выдает мне главную ошибку, и яне смог сделать это с np.delete(...)

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Массив numpy (ndarray) равен quote :

ndarray - это (обычно фиксированный размер) многомерный контейнер элементов одного типа и размера.

Таким образом, вы не можете иметь строки различной длины, если хотите использовать структуру данных ndarray (со всеми ее оптимизациями).

Возможный обходной путь - иметь массивсписков

>>> arr=np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9],
    []
])

(обратите внимание на пустую строку для выхода из типа данных ndarray)

, чтобы вы могли удалить элемент из одного из списков

>>> arr
array([list([1, 2, 3]), list([4, 5, 6]), list([7, 8, 9]), list([])],
      dtype=object)
>>> arr[1]=np.delete(arr[1], [1], axis=0)
>>> arr
array([list([1, 2, 3]), array([4, 6]), list([7, 8, 9]), list([])],
      dtype=object)
0 голосов
/ 26 июля 2019

Сначала преобразуйте массив в список, используя функцию
new_list = list (old_array) . (Это создаст список массивов)

Теперь вы можете выполнить всеоперации со списком, такие как pop, filter, и т. д., чтобы удалить любые элементы, которые вы хотите.

Наконец, когда у вас есть отфильтрованный список, преобразуйте его обратно в массив, используя

new_array = np.array (new_list) . (Этот новый массив сохранит размеры старого массива)

0 голосов
/ 22 февраля 2019

Я думаю, что одним из способов было бы привести np.array к списку и повторить приведение к np.array, например так:

arr = arr.tolist()
arr[1].pop(1)
arr = np.array(arr)

Редактировать: Кажется, это правильно, numpy способ:

np.delete(arr, [4, 4])
np.split(arr, [3, 5, 9])

Edit2: кажется, не занимает меньше времени, но вы можете проверить это следующим образом:

arr =  np.empty(3, dtype=np.object)
arr[:] = [1,2,3], [4,5,6], [7,8,9]
arr[1].remove(5)
...