простой вариант использования, если numpy.delete () не работает - PullRequest
0 голосов
/ 27 сентября 2018

вот некоторый код:

c = np.delete(a,b)
print(len(a))
print(a)
print(len(b))
print(b)
print(len(c))
print(c)

он возвращает:

24
[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55]
20
[46, 35, 37, 54, 40, 49, 34, 48, 50, 38, 42, 47, 33, 52, 41, 36, 39, 44, 55, 
51]
24
[32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55]

, как вы можете видеть, все элементы b появляются в a, но не удаляются.не могу понять почему.есть идеи?благодарю вас.

1 Ответ

0 голосов
/ 27 сентября 2018

numpy.delete не удаляет элементы, содержащиеся в b, он удаляет a[b], другими словами, b должен содержать индексы для удаления.Поскольку ваш b содержит только значения, превышающие длину a, никакие значения не удаляются.В настоящее время индексы вне границ игнорируются, но в будущем это не будет так:

/usr/local/bin/ipython3:1: DeprecationWarning: in the future out of bounds indices will raise an error instead of being ignored by `numpy.delete`.
  #!/usr/bin/python3

Чистым решением на Python будет использование set:

set_b = set(b)
c = np.array([x for x in a if x not in set_b])
# array([32, 43, 45, 51, 53])

И использованиеnumpy широковещательная рассылка для создания маски, определяющей, какие значения следует удалить:

c = a[~(a[None,:] == b[:, None]).any(axis=0)]
# array([32, 43, 45, 51, 53])

Они примерно одинаковы по скорости с данным примером, но подход numpy подходит и занимает больше памяти (поскольку генерирует2D матрица, содержащая все комбинации a и b).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...