Numpy: np.random.choice retorna o índice fora do intervalo no prob da matriz mascarada.

Criado em 15 ago. 2020  ·  6Comentários  ·  Fonte: numpy/numpy

import numpy as np

a = np.array([0.1, 0.2, 0.4, 0.3])
masked_a = np.ma.masked_array(a, [0, 0, 1, 1])
counter = np.zeros(len(a) + 1)
while True:
    action = np.random.choice(len(a), p=masked_a)
    counter[action] += 1
    print(counter / counter.sum())

# [0.09931198 0.20076697 0.         0.         0.69992105]

Ele não deve retornar um índice> 3, mas quando o último elemento da matriz mascarada for verdadeiro, ele pode retornar um índice = 4

00 - Bug numpy.ma numpy.random

Todos 6 comentários

O problema também ocorre em Generator.choice na versão de desenvolvimento do numpy:

In [1]: import numpy as np

In [2]: np.__version__ 
Out[2]: '1.20.0.dev0+986e533'

In [3]: rng = np.random.default_rng()

In [4]: pm = np.ma.masked_array([0.1, 0.2, 0.4, 0.3], mask=[0, 0, 1, 1])

In [5]: rng.choice(4, p=pm, size=12)
Out[5]: array([4, 4, 4, 0, 4, 1, 4, 0, 0, 4, 4, 4])

Anteriormente, adicionei o rótulo "bug", mas isso é um julgamento subjetivo. Existem outras funções no numpy que não manipulam matrizes mascaradas corretamente (ou melhor, "corretamente", já que "correção" também pode ser um julgamento), onde não necessariamente consideramos isso um bug. Talvez este seja apenas um exemplo de comportamento indefinido e a resposta curta para o problema seja "não faça isso!". Seria melhor, entretanto, se pudéssemos lançar uma exceção em vez de retornar resultados sem sentido.

Seria fácil adicionar uma verificação explícita para uma matriz mascarada e gerar um erro se algum dos valores realmente estivesse mascarado, mas isso parece uma correção ad hoc muito específica.

Generator.choice enviado para __array_function__ ? Se não, provavelmente deveria.

Se isso acontecer, então acho que apenas adicionamos isso com todos os outros "decaimentos de maskedarray porque não implementamos __array_function__ ainda" bugs.

Anteriormente, adicionei o rótulo "bug", mas isso é um julgamento subjetivo. Existem outras funções no numpy que não manipulam matrizes mascaradas corretamente (ou melhor, "corretamente", já que "correção" também pode ser um julgamento), onde não necessariamente consideramos isso um bug. Talvez este seja apenas um exemplo de comportamento indefinido e a resposta curta para o problema seja "não faça isso!". Seria melhor, entretanto, se pudéssemos lançar uma exceção em vez de retornar resultados sem sentido.

Seria fácil adicionar uma verificação explícita para uma matriz mascarada e gerar um erro se algum dos valores realmente estivesse mascarado, mas isso parece uma correção ad hoc muito específica.

Eu acho que se ele não lidar com isso corretamente, ele não deve permitir a passagem de array mascarado (deve gerar uma exceção), mas funciona corretamente na maioria das vezes (funciona bem, exceto em alguns casos). isso pode causar problemas potenciais para o ambiente de produção.

Não há uso de __array_function__ em Generator . Embora muitas entradas de força sejam bem comportadas C contíguas, é provável que algumas funções nem sempre forcem isso religiosamente o suficiente.

Se você adicionar NPY_ARRAY_ENSUREARRAY , você terminará com um ndarray que está cheio e ignora a máscara. É difícil dizer que isso é "correto". No exemplo de @WarrenWeckesser , isso acaba usando pm=np.array([.1,.2,.3,.4]) como as probabilidades.

Esta página foi útil?
0 / 5 - 0 avaliações