2011-12-04 14 views
10

Dopo averlo usato per un po ', mi piace molto l'array multidimensionale di Numpy. È utile scrivere algoritmi con un codice conciso ma leggibile e abbastanza generale. Vorrei avere la stessa cosa in Java. Prima di codificare un array multidimensionale con una API simile a Numpy, c'è già una cosa del genere?Equivalente Java per l'oggetto multidimensionale Numpy

[PS] Ho cercato un po ', non ha visto

+1

Se si fa riferimento alla piattaforma Java *, [Scalala] (https://github.com/scalala/Scalala) sembra un buon candidato ... –

risposta

4

Quindi la partita più vicina sembra essere Colt! http://acs.lbl.gov/software/colt/

È dotato di un oggetto array multidimensionale, viste su un array e la solita algebra lineare! E sembra essere piuttosto efficiente.

+3

Puoi rispondere, quale classe di Colt rappresenta array multidimensionale? – Dims

+0

@Dims l'interfaccia per gli array multidimensionali è AbstractMatrix http://dst.lbl.gov/ACSSoftware/colt/api/cern/colt/matrix/impl/AbstractMatrix.html. Le implementazioni fornite in Colt coprono solo casi con dimensioni 1, 2 e 3. – dlegland

1

È possibile utilizzare le librerie numerici per l'algebra lineare; quelli avranno matrici in loro. Dai un'occhiata a Apache Commons Math.

+1

Sono a conoscenza di quella libreria. L'API è un classico "vettore e matrice". Ne sto cercando uno con un Numpy come uno, che fornisce array multidimensionali, unificando vettori e matrici come un'unica entità. Un simile approccio, basato sull'esperienza personale, rende più facile scrivere molti codici matematici. – Monkey

+0

Vectorz (vedere la mia risposta) fornisce array multidimensionali arbitrari con una singola astrazione di interfaccia (INDArray) che viene implementata sia da vettori che da matrici – mikera

0

Direi che java non ha nulla di "simpatico". numpy è un grande progetto orientato alla matematica che non si adatta perfettamente alla mentalità java.

Non è che non ci siano buone librerie di raccolta in java! Guava ha l'interfaccia Table con due buone implementazioni, ArrayTable e HashBasedTable. È più una raccolta di raccolte che uno strumento matematico, ma è molto utile.

Per la velocità e l'efficienza della memoria, threre è trove. Una raccolta di raccolte che funziona con i primitivi.

Per le operazioni matematiche, JAMA sembra buono.

Per quanto ne so, sarà necessario codificare di più e utilizzare più librerie in java che python.

3

La libreria Vectorz (https://github.com/mikera/vectorz) offre una NDArray completamente descritto che è sostanzialmente equivalente in funzionalità NDArray di Numpy, cioè offre le caratteristiche fullowing:

  • arbitrarie array N-dimensionali di valori numerici (in questo caso, Java raddoppia)
  • vista leggera con strided accesso per affettare efficiente
  • Una vasta gamma di mathem atical operazioni con le implementazioni effiecient

E 'anche molto veloce: è molto più veloce allora NumPy per la maggior parte delle operazioni, anche se NumPy può essere ancora più veloce per alcune grandi operazioni di matrice perché utilizza le BLAS librerie native per accelerare queste.

Ecco la classe NDArray stessa:

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

Diniego: Sono l'autore di Vectorz

+0

Numpy può essere compilato con supporto BLAS nativo, ad es. OpenBlas o ATLAS. Vectorz sfrutta la libreria algebrica lineare ottimizzata? – mariolpantunes

+0

Vectorz non supporta librerie native: è stato appositamente progettato per essere puro codice JVM. Esistono altre librerie Java (ad esempio MTJ, JBlas) che possono utilizzare BLAS. – mikera

+0

Ciao Mike. Ho trovato Vectorz molto attraente per me. Sto lavorando alla trasformazione del formato colore da RGB a HSL in tempo reale e penso che Vectorz sia esattamente ciò di cui ho bisogno. È possibile applicare alcune espressioni matematiche a ogni elemento della matrice in modo efficiente? Supponendo che una matrice sia una rappresentazione del singolo fotogramma della telecamera, diciamo array 2D. –

2

Scala ha un numero più ampio di librerie NumPy simile, se quello che conta. (Dovresti anche essere in grado di usarli da Java.)

BIDMat promette di essere sia potente che veloce (e alimentato da GPU).

Come già detto, c'è anche Breeze

6

L'OP è a partire dal 2011. Così come della fine del 2015 vorrei menzionare che c'è un nuovo bambino in città che pretende di essere NumPy per Java ->nd4j . La cosa bella è che nd4j è uno strato di astrazione su librerie diverse come Blas. A seconda della dimensione delle matrici, esistono implementazioni sottostanti due volte come fast come numpy o jblas. E il tuo codice è indipendente dalla piattaforma reale.

1

Un'altra ottima opzione è l'utilizzo dell'API DataFrame di Spark.

http://spark.apache.org/docs/latest/sql-programming-guide.html

Questo vi dà un panda/Numpy come l'interfaccia per gli array in Java. Inoltre, il codice è intrinsecamente parallelizzabile e può essere eseguito su un cluster di macchine se le dimensioni dei dati aumentano.