Ich arbeite mit einem 2D Numpy masked_array in Python. Ich muss die Datenwerte im maskierten Bereich so ändern, dass sie dem nächsten unmaskierten Wert entsprechen.Füllen Sie fehlende Werte mit dem nächsten Nachbarn in Python numpy masked arrays?
NB. Wenn es mehr als einen nächsten unmaskierten Wert gibt, kann er einen dieser nächsten Werte annehmen (von denen einer am einfachsten zu codieren ist).
z.B.
import numpy
import numpy.ma as ma
a = numpy.arange(100).reshape(10,10)
fill_value=-99
a[2:4,3:8] = fill_value
a[8,8] = fill_value
a = ma.masked_array(a,a==fill_value)
>>> a [[0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 -- -- -- -- -- 28 29]
[30 31 32 -- -- -- -- -- 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 -- 89]
[90 91 92 93 94 95 96 97 98 99]],
- Ich brauche es wie folgt aussehen:
>>> a.data [[0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] [20 21 22 ? 14 15 16 ? 28 29] [30 31 32 ? 44 45 46 ? 38 39] [40 41 42 43 44 45 46 47 48 49] [50 51 52 53 54 55 56 57 58 59] [60 61 62 63 64 65 66 67 68 69] [70 71 72 73 74 75 76 77 78 79] [80 81 82 83 84 85 86 87 ? 89] [90 91 92 93 94 95 96 97 98 99]],
NB. woher "?" könnte einen der benachbarten unmaskierten Werte annehmen.
Was ist der effizienteste Weg, dies zu tun?
Danke für Ihre Hilfe.
Great! Das funktioniert für meine Zwecke. Eine Frage - könnte es verallgemeinert werden, um für größere Datenlücken zu arbeiten, wo der nächste unmaskierte Wert mehr als einen Punkt entfernt ist? –
@Pete - Ein schneller Weg, dies zu tun, besteht darin, die for-Schleifen in ein 'while np.any (a.mask):' einzufügen. @unutbu - Verflucht übrigens übrigens die Interpolation der nächsten Nachbarn! –
Danke Joe! Komplimente von dir machen mich sehr glücklich. :) – unutbu