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
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 esnomask
(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.
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
?