Używam Pythona do pracy z dużymi tablicami (około 2000 x 2000), gdzie każdy punkt I
, J
w macierzy reprezentuje pojedynczy piksel.Python - wydajna reprezentacja pikseli i związanych z nimi wartości
Same matryce są rzadkie (tj. Znaczna część z nich będzie miała wartości zerowe), ale gdy są one aktualizowane, mają tendencję do operacji przyrostowych, do dużej liczby sąsiednich pikseli w prostokątnym "bloku", zamiast do losowe piksele tu lub tam (właściwość, której obecnie nie używam na moją korzyść ..). Obawia się trochę nowości w arytmetyce macierzy, ale przyjrzałem się wielu możliwym rozwiązaniom, w tym różnym smakom rzadkich macierzy scipy
. Do tej pory najbardziej obiecujące były matryce koordynacyjne (COO). Tak na przykład, gdzie chcę, aby zwiększyć kształt jednego bloku, będę musiał zrobić coś wzdłuż linii:
>>> from scipy import sparse
>>> from numpy import array
>>> I = array([0,0,0,0])
>>> J = array([0,1,2,3])
>>> V = array([1,1,1,1])
>>> incr_matrix = sparse.coo_matrix((V,(I,J)),shape=(100,100))
>>> main_matrix += incr_matrix #where main_matrix was previously defined
w przyszłości, chciałbym mieć bogatszą reprezentację wartość piksela w anycase (krotki do reprezentowania RGB itd.), coś, co nie jest obsługiwane przez tablicę numpy (po prostu potrzebuję użyć this).
Docelowo będę miał kilka tych matryc, które będę musiał wykonać w prosty sposób, i będę potrzebował kodu, aby był tak wydajny, jak to tylko możliwe - i dystrybuowalny, więc musiałbym być w stanie utrzymywać i wymieniać te obiekty w małej reprezentacji bez znacznych kar. Zastanawiam się, czy to jest właściwa droga, czy powinienem wyglądać, tocząc moje własne struktury za pomocą dicts
itp?
Wątpię, czy mógłbyś produkować coś lepszego niż możliwości scipy i numpy. Ale nie jestem dostatecznie wyszkolony, aby być bardziej pozytywnym. Nawiasem mówiąc, nie podoba mi się użycie słowa "wektor". Z jednej strony nie ma wbudowanej struktury danych o nazwie "wektor" w Pythonie. Z drugiej strony mało prawdopodobne jest, aby stół dwuwymiarowy nazywał się "wektorem" w sensie matematycznym. Tak więc twoja encja to nie obiekt Pythona o nazwie 'vector', ani struktura matematyczna o nazwie 'vector' – eyquem
która jest prawdziwa - powinna rzeczywiście powiedzieć, że macierz zamiast wektora (?) :) – malangi
2000x2000 nie jest wcale bardzo duży. Nie ma potrzeby używania rzadkich tablic. Powinieneś uzyskać znacznie lepszą wydajność dzięki zwykłym tablicom numpy. Nawiasem mówiąc, numpy _very_ znacznie wspiera "coś w rodzaju" wektorów RGB "dla każdego piksela ... To tylko tablica 2000x2000x3! To działa dobrze, a to jest bardzo efektywne! –