2015-04-25 20 views
6

Pracuję nad projektem, w którym muszę zajmować się trójwymiarową dużą tablicą. Używałem numpy 3d tablica, ale większość moich wpisów będzie zero, więc jest dużo strat pamięci. Scipy rzadki wydaje się dopuszczać tylko matrycę 2D. Czy istnieje inny sposób, w jaki mogę przechowywać trójdzielną tablicę 3D?Python wielowymiarowa rzadka tablica

Odpowiedz

1

Masz rację; nie wygląda na to, że istnieją sprawdzone narzędzia do pracy z n-wymiarowymi rzadkimi tablicami. Jeśli potrzebujesz tylko dostępu do elementów z tablicy, istnieją opcje, używając słownika na krotkach. Zobacz:

sparse 3d matrix/array in Python?

Jeśli trzeba wykonać operacje na macierzy rzadkiej 3d, robi harder- może trzeba zrobić niektóre z siebie kodowania.

+0

Nie chciałem używać słownika, ponieważ muszę wykonać operacje wektorowe na tablicy. Nie wiem, czy będą szybkie ze słownikiem? – Naman

+0

Dodaj przykłady operacji wektorowych, które chcesz zadać. To może sugerować, który format jest najkorzystniejszy i czy można go dostosować. – hpaulj

4

scipy.sparse ma wiele formatów, ale tylko kilka ma wydajny zestaw operacji numerycznych. Niestety, te są trudniejsze do przedłużenia.

używa krotki indeksów jako kluczy słownika. Łatwo to uogólnić z 2d na 3d lub więcej. coo ma row, col, data tablice atrybutów. Koncepcyjnie więc dodanie trzeciego depth (?) Jest łatwe. lil prawdopodobnie wymagałoby list na listach, które mogłyby stać się nieporządne.

Ale csr i csc sklep tablica w indices, indptr i data tablic. Format ten został opracowany wiele lat temu przez matematyków pracujących z problemami algebry liniowej, wraz z wydajnymi operacjami matematycznymi (np. Multiplikacja macierzy). (Odpowiedni artykuł jest cytowany w kodzie źródłowym).

Reprezentowanie rzadkich tablic 3d nie stanowi problemu, ale wdrożenie wydajnych operacji wektorowych może wymagać pewnych podstawowych badań matematycznych.

Czy naprawdę potrzebujesz układu 3D do wykonywania operacji wektorowych? Czy mógłbyś, na przykład, zmienić kształt 2 wymiarów na 1, przynajmniej tymczasowo?

Operacje elementów po elementach (*, +, -) działają równie dobrze z danymi spłaszczonej macierzy, jak w przypadku wersji 2 lub 3d. np.tensordot obsługuje mnożenie macierzy nD poprzez zmianę kształtu wejść na tablice 2D i stosowanie np.dot. Nawet jeśli w tablicach 3d używane jest np.einsum, suma produktów wynosi zwykle tylko jedna para wymiarów (np. "Ijk, jl-> ikl")

Reprezentacja 3D może być koncepcyjnie wygodna, ale nie mogę myśleć o operacja matematyczna, która tego wymaga (zamiast 2 lub 1d).

Ogólnie sądzę, że uzyskasz większą szybkość od przekształcania swoich tablic niż od próby znalezienia/wdrożenia prawdziwych operacji rzadkich 3d.

Powiązane problemy