Is it? For lack of NA bit patterns in NumPy it's either use a special value (like NaN) or use masked arrays. If you choose the latter, I say to you: good luck.
NaN as commonly used already has a meaning: it's the result of a calculation whose inputs were known, and the calculation is known to be undefined for those specific inputs. "Unknown" means something entirely different: that we don't know what the inputs were, but if we did they are unlikely to have been NaN.
Conflating the two concepts means you can't tell the difference given the result set. It's just a happy accident that "unknown" and NaN have identical propagation rules, but that doesn't mean that it's safe to use one in place of the other. Reading up on it, it looks like Octave and Matlab can treat NaN as "missing data", though, so I guess there's a certain "industry standard behaviour" to follow so as not to surprise users, but it's still less than ideal.
In an ideal world, we could define an explicit "missing data" quiet NaN which would have a distinct visual representation - I suspect this is doable with access to the float exponent bits, but I don't know how Python could take advantage of it.
Well, masked arrays are a very good solution for the right problem (i.e. temporarily or permanently flagging data as "bad" while preserving the original data). Not to rehash the old debate, but they're quite handy when you need them.
I do agree that NaN's are a better choice for truly missing data, but I'm biased just because they use less memory. They're not a solution for non-floating point data, though.