Interpolieren Sie mit Python die 2D-Matrix entlang der Spalten


Unbekannter Benutzer

Ich versuche, eine 2D-Numpy-Matrix mit den Dimensionen (5, 3) in eine Matrix mit den Dimensionen (7, 3) entlang der Achse 1 (Spalten) zu interpolieren. Offensichtlich wäre der falsche Ansatz, Zeilen irgendwo zwischen der ursprünglichen Matrix zufällig einzufügen, siehe folgendes Beispiel:

Source:
 [[0, 1, 1]
  [0, 2, 0]
  [0, 3, 1]
  [0, 4, 0]
  [0, 5, 1]]

Target (terrible interpolation -> not wanted!):
 [[0, 1, 1]
  [0, 1.5, 0.5]
  [0, 2, 0]
  [0, 3, 1]
  [0, 3.5, 0.5]
  [0, 4, 0]
  [0, 5, 1]]

Der richtige Ansatz wäre, jede Zeile zu berücksichtigen und zwischen allen zu interpolieren, um die Quellmatrix zu einer (7, 3) -Matrix zu erweitern. Ich kenne die Methoden scipy.interpolate.interp1d oder scipy.interpolate.interp2d, konnte sie jedoch nicht für andere Stack Overflow-Posts oder Websites verwenden. Ich hoffe, jede Art von Tipps oder Tricks zu erhalten.

Update Nr. 1: Die erwarteten Werte sollten gleichmäßig verteilt sein.

Update Nr. 2: Ich möchte im Grunde genommen die separaten Spalten der ursprünglichen Matrix verwenden, die Länge der Spalte auf 7 erweitern und zwischen den Werten der ursprünglichen Spalte interpolieren. Siehe folgendes Beispiel:

Source:
 [[0, 1, 1]
  [0, 2, 0]
  [0, 3, 1]
  [0, 4, 0]
  [0, 5, 1]]

Split into 3 separate Columns:
 [0    [1    [1
  0     2     0
  0     3     1
  0     4     0
  0]    5]    1] 

Expand length to 7 and interpolate between them, example for second column:
 [1
  1.66
  2.33
  3
  3.66
  4.33
  5]   
Rupie

Es scheint, dass jede Spalte vollständig unabhängig behandelt werden kann, aber für jede Spalte müssen Sie im Wesentlichen eine "x" -Koordinate definieren, damit Sie eine Funktion "f (x)" anpassen können, aus der Sie Ihre Ausgabematrix generieren. Sofern die Zeilen in Ihrer Matrix keiner anderen Datenstruktur zugeordnet sind (z. B. einem Vektor von Zeitstempeln), ist ein offensichtlicher Satz von x-Werten nur die Zeilennummer:

x = numpy.arange(0, Source.shape[0])

Sie können dann eine Interpolationsfunktion erstellen:

fit = scipy.interpolate.interp1d(x, Source, axis=0)

und verwenden Sie das, um Ihre Ausgabematrix zu erstellen:

Target = fit(numpy.linspace(0, Source.shape[0]-1, 7)

welches produziert:

array([[ 0.        ,  1.        ,  1.        ],
       [ 0.        ,  1.66666667,  0.33333333],
       [ 0.        ,  2.33333333,  0.33333333],
       [ 0.        ,  3.        ,  1.        ],
       [ 0.        ,  3.66666667,  0.33333333],
       [ 0.        ,  4.33333333,  0.33333333],
       [ 0.        ,  5.        ,  1.        ]])

Standardmäßig verwendet scipy.interpolate.interp1d die stückweise lineare Interpolation. Es gibt viel mehr exotische Optionen in scipy.interpolate , basierend auf Polynomen höherer Ordnung usw. Interpolation ist ein großes Thema an sich, und es sei denn, die Zeilen Ihrer Matrix haben bestimmte Eigenschaften (z. B. reguläre Abtastungen eines Signals mit einer bekannten Frequenz) Bereich) gibt es möglicherweise keine "wirklich korrekte" Art der Interpolation. Bis zu einem gewissen Grad wird die Wahl des Interpolationsschemas also etwas willkürlich sein.

Verwandte Artikel


Interpolieren Sie Daten mit mehreren Spalten

Afzal Ich bin neu in Python. Ich versuche, Datenwerte aus einem Datensatz zu interpolieren, der wie folgt aussieht: a = [45.0.0.0017317314, -0.00274, ...] [45.07.0.00173326, -0.002278, ...]. . . Ich möchte die Werte der Daten von der zweiten bis zur letzten Sp

Interpolieren Sie die Matrix komplexer Zahlen

Machu Picchu Ich möchte eine Reihe komplexer Zahlen drehen (was eigentlich eine 1D-FFT einer Linie der Radon-Transformation ist), die ich imrotatein Matlab verwende, aber ich denke nicht, dass die Interpolation das tut, was sie sollte. Ziel ist es, die Umwandl

Interpolieren Sie Bestandsdaten in Pandas mit 2 Spalten

404pio Ich möchte eine Interpolation von Aktienkursen durchführen. Ich habe fehlende Daten für einen einzelnen Tag (wie im Beispiel): import numpy as np import pandas as pd dates = pd.date_range('20130101', periods=6) df = pd.DataFrame( {'opening': [0.5, 1