Uzupełnianie pustych pól macierzy

0

Siemka, czy ktoś się gdzie znajdę/jak nazywa się algorytm do uzupełniania macierzy na podstawie wartości się w niej znajdujących?
W zamyśle mam coś takiego, jest sobie baza danych, w której nadpisywane są dane (dotyczące temperatur). Chciałbym dane z tej bazy wpisywać do macierzy, a potem użyć jakiegoś algorytmu który uzupełniłby resztę tej macierzy na podstawie wartości się w niej znajdujących. Pełna macierz trafiałaby do node-reda i tam zamieniana byłaby na heatmap. Czy ma ktoś pomysł jak mogę coś takiego uzyskać?

0

Dlaczego chcesz wprowadzać dane temperaturowe do macierzy i z tego robić heatmap?

  • trzymanie tych temperatur w macierzy jest trochę bez sensu, macierz jest kiepskim pomysłem na reprezentację położenia jakichś np. punktów pomiarowych w przestrzeni. Nawet do tego nie służy.
  • heatmap to trochę co innego niż rozkład temperatur, heatmap tworzysz mając np. dane o włamaniach i chcąc zrobić wizualizację częstości tych włamań bez zaśmiecania mapy milionami kropek itp.

Zależy ile masz punktów pomiarowych i jak są rozłożone w przestrzeni, ale jak już chcesz coś z tym robić to możesz np:

  • zrobić aproksymację na interesującym Cię obszarze - bardzo słabe, bo wszystko się może uśrednić i nawet w punktach pomiarowych dostaniesz inne temperatury, niż były w rzeczywistości
  • zrobić interpolację na całym interesującym Cię obszarze - jeszcze gorzej, niby punkty pomiarowe się będą zgadziesz, ale dostaniesz porypane oscylacje i np. między Warszawą a Krakowem będzie miejsce z rekordową temperaturą +500*C
  • zbudować siatkę trójkątów i/lub czworokątów z Twoich punktów pomiarowych i robić interpolację z 3-4 punktów wewnątrz każdego wielokąta, ważoną wg. względnych współrzędnych - podejście o tyle dobre, że nie będziesz miał oscylacji, nic się nie uśredni, dostaniesz faktyczne wyniki w punktach pomiarowych, poza tym wartości będą ciągłe (nie będzie przeskoków)

Współrzędne naturalne to w przypadku trójkąta odległości od poszczególnych krawędzi trójkąta. Na krawędzi K współrzędna k jest równa 0, a w wierzchołku naprzeciwko K ma wartość 1. Mają jeszcze taką fajną właściwość, że 3 współrzędne zawsze się sumują do 1. Dla czworokątów da się wyprowadzić coś podobnego, choć formuły w tej chwili nie pamiętam.

0
superdurszlak napisał(a):
  • trzymanie tych temperatur w macierzy jest trochę bez sensu, macierz jest kiepskim pomysłem na reprezentację położenia jakichś np. punktów pomiarowych w przestrzeni. Nawet do tego nie służy.

Niekoniecznie. Współczesne obrazowanie w astronomii opiera się na takim rozwiązaniu: https://en.wikipedia.org/wiki/FITS o ile uświadomisz sobie, że rozkład jasności jest pochodną temperatury obiektów (choć nie tylko).

0

@Pyxis: temat ten założyłem wcześniej niż tamten, bo jeszcze nie wiedziałem jak to zrobić, po dowiedzeniu się że python będzie najlepszy/najprostszy napisałem temat tam. Twoje rozwiązanie praktycznie rozwiązało mój problem, choć mam jeszcze pytanie: czy można uzupełniać macierz, która punkty posiada np. w 4 innych miejscach niż rogi? teraz posiadając cztery wartości w tym jedną w komórce 1,1 cały pierwszy rząd i kolumna są wypełnione NaNami(prócz wartości na końcu tego rzędu i kolumny oczywiście, bo te wartości są podane)

0

@superdurszlak: może źle to określiłem, nie będzie to stricte heatmap, tylko tabela z wartościami zakolorowanymi w zależności od stopnia odchylenia od wartości idealnej, im bliżej tym bardziej zielone, im dalej tym bardziej czerwone. Dalej te dane lecą do bazy danych i stamtąd są sczytywane już przez stronę docelową, macierz jest tylko pośrednikiem tego wszystkiego, więc wydajność tego rozwiązania nie ma większego znaczenia, bo nowe dane będą się generowały co ok. 5 minut, a raczej przez tyle czasu operacja zdąży się wykonać. Punkty pomiarowe są na tym samym polu, więc nie będzie to więcej jak kilkaset metrów (kilkadziesiąt metrów między czujnikami) więc, choć nie jestem żadnym specem, to uśrednienie nie będzie takie złe. Choć przyjmę lepszy pomysł jeśli taki masz :D Aktualnie korzystam z interpolacji w pandas.

0
adammo94 napisał(a):

Twoje rozwiązanie praktycznie rozwiązało mój problem, choć mam jeszcze pytanie: czy można uzupełniać macierz, która punkty posiada np. w 4 innych miejscach niż rogi?

Tak, skorzystaj z parametru limit_direction w metodzie interpolate:

d = d.interpolate(limit_direction='both')
d = d.interpolate(axis=1, limit_direction='both')

1 użytkowników online, w tym zalogowanych: 0, gości: 1