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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top