Por que uma tarefa para matrizes de dupla cortado numpy não trabalho?
-
18-09-2019 - |
Pergunta
Por que as linhas a seguir não funciona como eu esperava?
import numpy as np
a = np.array([0,1,2,1,1])
a[a==1][1:] = 3
print a
>>> [0 1 2 1 1]
# I would expect [0 1 2 3 3]
Isso é um 'bug' ou há outra maneira recomendada para isso?
Por outro lado, as seguintes obras:
a[a==1] = 3
print a
>>> [0 3 2 3 3]
Cheers, Philipp
Solução
Parece que você simplesmente não pode fazer uma atribuição através de um duplo-slice assim.
Isso funciona embora:
a[numpy.where(a==1)[0][1:]] = 3
Outras dicas
É relacionado a como a fantasia de indexação funciona. Há uma explicação completa aqui . Ele é feito desta forma para permitir a modificação inplace com indexação fantasia (ou seja a[x>3] *= 2
). A consequência disto é que você não pode atribuir a um duplo indexador como você encontrou. indexação fantasia sempre retorna uma cópia em vez de um ponto de vista.
Porque a um [a == 1] parte não é realmente uma fatia. Ele cria uma nova matriz. Faz sentido quando você pensa sobre ele-- você está tomando apenas os elementos que satisfazem a condição booleana (como uma operação do filtro).
Este faz o que quiser
a[2:][a[2:]==1]=3