import numpy as np
bc = np.arange(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# regular way using NumPy function
np.diff(bc) # array([1, 1, 1, 1, 1, 1, 1, 1, 1])
# something similar with array subtraction:
bc[1:] - bc[:-1] # array([1, 1, 1, 1, 1, 1, 1, 1, 1])
# but this does the wrong thing:
bc[1:] -= bc[:-1] # array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5])
В C и C++ программист, я могу понять, почему это происходит (это тетсру() вместо memmove() снова и снова), но похоже, конечных пользователей Python и NumPy может и не ожидать этого. И я не нашел никакой документации, говорящей, что это не сработает.NumPy: Ошибочный результат при изменении массива, используя себя
Вопрос: есть ли здесь ошибка в NumPy (возможно, нет), или есть какая-то документация NumPy, объясняющая, что такое правила в таких ситуациях, или это отсутствует в документации?
Во-вторых, я хотел бы выяснить безопасное рабочее решение, которое является квазиоптимальным в пространстве и времени. То есть, он не должен выделять память за пределы постоянной величины, и это не должно быть глупым чипом pure-Python for for. :) Таковы цели, которые можно надеяться достичь с помощью модификации на месте, которая явно не работает.
Я использую NumPy 1.8.0.
Внутренне 'diff' использует ту же самую разницу среза. Ломтики не используют лишнюю память. Для вывода используется только добавленная память. Поскольку выход имеет размер, отличный от ввода, я не вижу необходимости в различии на месте (особенно, если шаг diff больше 1). – hpaulj
'np.subtract (bc [1:], bc [: - 1], out = bc [: - 1])' производит '[1, 1, 1, 1, 1, 1, 1, 1, 1, 9] '- желаемая разница, за исключением того, что неизменный термин находится в конце. – hpaulj