Ausgewählte Array Werte linear interpolieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Finn_h
User
Beiträge: 12
Registriert: Samstag 30. Mai 2020, 08:51

Hallo zusammen,

ich habe ein zweidimensionales Array und möchten bei überschreiten einer Schwelle eine andere Zeile linear interpolieren. Ich habe das Probelm über mehrere aneinandergereihte For-Schleifen/ list comprehensions gelöst, vermute aber dass man das geschickter machen kann.

Danke für die Hilfe.

Code: Alles auswählen

array = np.array([[5, 8, 3, 2, 5, 6, 3, 7, 3, 7, 8, 5, 4, 5],
                 [0.5, 0.2, 0.7, 0.9, 0.9, 0.85, 0.2, 0.2, 0.9, 0.85, 0.2, 0.85, 0.95, 0.5],
                  [20, 21, 25, 27, 23, 20, 19, 18, 16, 17, 16, 19, 23, 24]])

# find out critical indices
a = [x[0] for x in enumerate(array[1, :]) if x[1] < 0.8]
# find out where critical indices are not in line
z = [[a[x], a[x + 1]] for x in range(len(a) - 1) if (a[x + 1] - a[x]) > 1]
# calculate linear interpolation
b = [(array[2, z[x][0]] + np.cumsum(array[0][z[x][0] + 1:z[x][1]]) * (array[2, z[x][1]] - array[2, z[x][0]]) / sum(
    array[0][z[x][0]+1:z[x][1]]+1)) for x in range(len(z))]
# insert into base array
li = array[2, :].tolist()
j = 0
for i in b:
    li[z[j][0] + 1: z[j][1]] = i
    j += 1

array[2, :] = li
print(array)

Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man for-Schleifen und numpy-Arrays benutzt, dann macht man etwas falsch.
Ich verstehe den Inhalt von `array` nicht, so dass ich auch nicht sagen kann, ob das sinnvoll ist, oder nicht, die Verwendung von cumsum sieht jedenfalls seltsam aus.
Das Vorgehen ist jedenfalls, abmaskieren der Ausreißer und linear drüber-interpolieren:

Code: Alles auswählen

mask = array[1] < 0.8
xp = np.cumsum(array[0])
array[2] = np.interp(xp, xp[mask], array[2, mask])
Antworten