2011-12-04 10 views
10

Po pewnym czasie użytkowania bardzo podoba mi się wielowymiarowa tablica Numpy. Pomocne jest pisanie algorytmów o zwięzłym, ale czytelnym i dość ogólnym kodzie. Chciałbym mieć to samo w Javie. Przed samemu napisaniem wielowymiarowej tablicy z API podobnym do Numpy, czy jest już coś takiego?Ekwiwalent Java dla wielowymiarowego obiektu Numpy

[PS] Szukałem trochę, nie widzi

+1

Jeśli chodzi o platformę Java *, [Scalala] (https://github.com/scalala/Scalala) wygląda jak dobry kandydat ... –

Odpowiedz

4

Najbliżej pasuje do Colta! http://acs.lbl.gov/software/colt/

Posiada wielowymiarowy obiekt tablicy, widoki tablicy i zwykłej algebry liniowej! I wydaje się, że jest dość skuteczny.

+3

Czy możesz odpowiedzieć, która klasa Colta reprezentuje tablicę wielowymiarową? – Dims

+0

@ Dims interfejsu wielowymiarowych tablic jest AbstractMatrix http://dst.lbl.gov/ACSSoftware/colt/api/cern/colt/matrix/impl/AbstractMatrix.html. Wdrożenia dostarczone w Colt obejmują tylko 1, 2 i 3 wymiarowe przypadki. – dlegland

1

Można użyć biblioteki numeryczne do algebry liniowej; te będą miały w sobie matematykę. Spójrz na Apache Commons Math.

+1

Jestem świadomy tej biblioteki. API to klasyczny "wektor i macierz". Szukam jednego z Numpy jak jeden, który zapewnia wielowymiarowe tablice, unifikujące wektory i macierze jako jedną całość. Takie podejście, oparte na osobistym doświadczeniu, okazuje się łatwiejsze do napisania. – Monkey

+0

Vectorz (zobacz moją odpowiedź) dostarcza dowolne wielowymiarowe tablice z abstrakcją jednego interfejsu (INDArray), która jest implementowana przez oba wektory i macierze. – mikera

0

Powiedziałbym, że java nie ma niczego "podobnego" do numpy. numpy to duży projekt zorientowany na matematykę, który nie pasuje do mentalności java.

Nie oznacza to, że w java nie ma dobrych bibliotek kolekcji! Guava ma interfejs Table z dwiema dobrymi implementacjami: ArrayTable i HashBasedTable. To bardziej biblioteka kolekcji, która jest narzędziem matematycznym, ale jest bardzo przydatna.

Aby zwiększyć szybkość i wydajność pamięci, należy wprowadzić trove. Biblioteka kolekcji działająca z prymitywami.

Dla operacji matematycznych wydaje się, że JAMA wygląda dobrze.

Z tego co wiem, będziesz musiał kodować więcej i używać więcej bibliotek w Javie niż w Pythonie.

3

Biblioteka Vectorz (https://github.com/mikera/vectorz) oferuje w pełni funkcjonalny NDArray który jest zasadniczo równoważny w funkcjonalność NumPy za NDArray, czyli oferuje funkcje fullowing:

  • arbitralne tablice n-wymiarowej z wartościami liczbowymi (w tym przypadku, Java podwaja)
  • Lekkie widoki wykorzystujące strided dostęp dla efektywnego krojenia
  • szeroki zakres mathem atical operacje z effiecient wdrożeń

Jest to także bardzo szybki: jest o wiele szybciej niż NumPy dla większości operacji, chociaż NumPy może być jeszcze szybciej dla niektórych dużych operacji macierzowych ponieważ używa natywnych bibliotek BLAS w celu przyspieszenia te.

Oto klasa NDArray sama:

https://github.com/mikera/vectorz/blob/develop/src/main/java/mikera/arrayz/NDArray.java

Zastrzeżone: Jestem autorem Vectorz

+0

Numpy można kompilować za pomocą macierzystej obsługi BLAS, np. OpenBlas lub ATLAS. Vectorz korzysta z jakiejś zoptymalizowanej biblioteki algebry liniowej? – mariolpantunes

+0

Vectorz nie obsługuje bibliotek natywnych - jest to celowo zaprojektowany jako czysty kod JVM. Istnieją inne biblioteki Java (np. MTJ, JBlas), które mogą korzystać z BLAS. – mikera

+0

Cześć Mike. Uważam, że Vectorz jest dla mnie bardzo atrakcyjny. Pracuję nad przekształceniem formatu kolorów z RGB na HSL w czasie rzeczywistym i uważam, że Vectorz dokładnie to, czego potrzebuję. Czy można efektywnie zastosować pewne wyrażenie matematyczne do każdego elementu macierzy? Zakładając, że macierz jest reprezentacją pojedynczej ramki kamery, powiedzmy tablicę 2D. –

2

Scala ma szerszą liczbę bibliotek NumPy podobny, jeśli to się liczy. (Powinieneś nawet móc używać ich z Javy.)

BIDMat obiecuje być zarówno potężny i szybki (i zasilany przez GPU).

Jak już wspomniano, istnieje również Breeze

6

PO jest od roku 2011. Tak jak od końca 2015 roku, chciałbym wspomnieć, że nie jest to nowy dzieciak w mieście, które uważa się za numpy Java ->nd4j . Zaletą jest to, że nd4j jest warstwą abstrakcji na różnych bibliotekach, takich jak blas. W zależności od rozmiaru twoich macierzy istnieją podstawowe implementacje dwukrotnie jako fast jako numpy lub jblas. Twój kod jest niezależny od platformy.