Numpy: ERROR: Establecer la máscara en una vista con mask = nomask no se propaga al propietario

Creado en 27 jun. 2016  ·  4Comentarios  ·  Fuente: numpy/numpy

Este es el problema con el que me encuentro durante mi trabajo.
El problema con la máscara cuando no está configurada

>>> a =np.arange(6,dtype=np.float64).reshape((2,3))
>>> a
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.]])
>>> am = np.ma.masked_array(a)
>>> am
masked_array(data =
 [[ 0.  1.  2.]
 [ 3.  4.  5.]],
             mask =
 False,
       fill_value = 1e+20)

>>> am[0][1]=np.ma.masked
>>> am
masked_array(data =
 [[ 0.  1.  2.]
 [ 3.  4.  5.]],
             mask =
 False,
       fill_value = 1e+20)

###--------- doesn't work----------------

>>> am[0,1]=np.ma.masked
>>> am
masked_array(data =
 [[0.0 -- 2.0]
 [3.0 4.0 5.0]],
             mask =
 [[False  True False]
 [False False False]],
       fill_value = 1e+20)

###-------this way it works---------

>>> am[1][1]=np.ma.masked
>>> am
masked_array(data =
 [[0.0 -- 2.0]
 [3.0 -- 5.0]],
             mask =
 [[False  True False]
 [False  True False]],
       fill_value = 1e+20)

###--------now it surprisingly works again--

Linux  3.19.8-100.fc20.x86_64 
Python 2.7.5
>>> np.__version__
'1.8.2'

Sé que mi sistema no está actualizado, pero le pregunté a un amigo que
y confirma que existe un problema

00 - Bug numpy.ma

Comentario más útil

Cada vez que pienso en nomask , también pienso en la cita de Donald Knuth, "La optimización prematura es la raíz de todos los males".

Me parece que nomask no es una excepción. El número de casos inusuales que uno encuentra a partir de este comportamiento es bastante grande y se hace más difícil de solucionar debido a ello.

Si realmente fuera tan productivo saber si la máscara era trivial o no, podríamos tener fácilmente un método como has_mask , que almacena en caché su resultado.

¿Existe algún interés en avanzar hacia la eliminación total de nomask ?

Todos 4 comentarios

Confirmado en master (1.12). Esto es como lo que # 5580 esperaba arreglar, pero como se discutió allí, este caso en particular no es posible solucionarlo sin una revisión de MaskedArray para eliminar np.nomask .

Aquí está el problema: MaskedArrays a veces almacena la máscara como una matriz de valores booleanos y, a veces (si no hay valores enmascarados) almacena la máscara simplemente como el valor False (y np.nomask == False).

El problema es que cuando se corta un MaskedArray (y se obtiene una vista), la máscara solo se puede "ver" si actualmente es un arreglo de valores booleanos, pero no si es la constante "Falso". Entonces, la primera vez que intentas am[0][1] = ... la máscara es la constante "Falso" y no se puede ver, por lo que no se actualiza. La segunda vez que lo intenta, la máscara se almacena como una matriz de valores booleanos para que se pueda ver y, por lo tanto, se actualice.

Agregue esto a la larga lista de errores causados ​​por este diseño nomask , por ejemplo, # 7588.

Cada vez que pienso en nomask , también pienso en la cita de Donald Knuth, "La optimización prematura es la raíz de todos los males".

Me parece que nomask no es una excepción. El número de casos inusuales que uno encuentra a partir de este comportamiento es bastante grande y se hace más difícil de solucionar debido a ello.

Si realmente fuera tan productivo saber si la máscara era trivial o no, podríamos tener fácilmente un método como has_mask , que almacena en caché su resultado.

¿Existe algún interés en avanzar hacia la eliminación total de nomask ?

Me gustaría comentar que también me he encontrado con este problema. Puede que valga la pena agregar una nota en la documentación al respecto. Lo siguiente me sugiere que modificar la máscara de una vista modificará la máscara del original.

Al acceder a un segmento, la salida es una matriz enmascarada cuyo atributo data es una vista de los datos originales, y cuya máscara es nomask (si no había entradas inválidas en la matriz original) o una vista del corte correspondiente de la máscara original. La vista es necesaria para asegurar la propagación de cualquier modificación de la máscara al original.

¿Existe algún interés en avanzar hacia la eliminación total de nomask?

Quizás, también masked . Esto probablemente se reduzca a realizar grandes cambios en las matrices enmascaradas o implementar una nueva clase por completo. Podría valer la pena armar un NEP. Rara vez uso matrices enmascaradas, por lo que esto es algo que mejor lo hacen las personas que necesitan la funcionalidad.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

kevinzhai80 picture kevinzhai80  ·  4Comentarios

'
Pezhvuk picture Pezhvuk  ·  4Comentarios

toddrjen picture toddrjen  ·  4Comentarios

ghost picture ghost  ·  4Comentarios

astrofrog picture astrofrog  ·  4Comentarios