2009-11-09 11 views
8

Ho letto che Python in realtà non supporta gli array 2D ma piuttosto una matrice di un array. Capisco la matrice di una cosa dell'array ma cosa significa sostenere gli array 2D?Cosa si intende per supporto array 2D?

In C un array 2D viene semplicemente convertito in un array 1D facendo un po 'di fantasia (Seen here). Esistono linguaggi che implementano array 2D effettivi?

Grazie per l'aiuto e spero di non aver scritto una domanda doppia; in tal caso dammi un collegamento e chiudi la mia domanda :)

risposta

10

Esistono linguaggi che implementano array 2D (o 3D, ecc.). Fortran è uno di loro. Significa che puoi scrivere un'espressione di indice di array come array[x,y] e il linguaggio si prenderà cura della matematica per trovare l'elemento corretto.

Inoltre, Numpy è un'estensione numerica di Python che fornisce matrici n-dimensionali.

+0

Numpy utilizza le estensioni C in modo che torni alla matematica dei puntatori con gli array C. – Nope

+4

Gli autori di numpy usano la matematica dei puntatori fantasiosi. Tu come utente non devi. –

1

Fortran ha vere matrici multidimensionali. This link ne parla nel caso FORTRAN 77.

2

C# ha un multidimensionale arrays, ma sono consigliati contro i matrici frastagliate (array di matrici) sono più performanti.

+0

Avete un riferimento per questo? –

+0

http://www.codeproject.com/KB/dotnet/arrays.aspx – SLaks

+0

http://uksbsguy.com/blogs/doverton/archive/2007/08/31/how-to-improve-array-performance-in -net-programming.aspx – SLaks

1

Suppongo che "supporto di array 2D" significhi come la lingua consente di accedere ai dati come se si trattasse di un array 2D. In c la matematica fantasia è nascosto da costrutti array:

char arr[5][5]; 
char c = arr[2][3]; 

C'è un modo per fare questo aritmetica puntatore così (che probabilmente si fa riferimento per la matematica come fantasia).

In realtà la memoria è una grande porzione di byte indirizzabili di dati [0,1,2,3,4,5,6 ... fine della memoria] quindi non esiste una nozione "nativa" di array 2D, qualcosa da qualche parte deve tradurre i programmatori "riga 1 colonna 2" in un indirizzo reale in memoria. I linguaggi di programmazione di solito ti offrono un modo per nascondere la traduzione.

6

Qualcuno ha già menzionato lo numpy e l'OP ha commentato che "è tornato alla matematica dei puntatori fantasiosi con i C array" - questo è un dettaglio di implementazione assolutamente banale! Dato che la memoria sottostante in un (normale ;-) computer può essere vista come una matrice di byte (o parole), beh allora ovviamente qualsiasi struttura dati qualunque sia implementato in cima a quell'array (o sue porzioni) più "Fantasia puntatore matematico": code a doppio attacco, array multidimensionali, alberi binari, il nome, le implementazioni sottostanti si riducono sempre a quello (proprio come tutte le strutture di controllo fantasiose si riducono a salti condizionali e incondizionati a livello di macchina , e così via). SO COSA?! Questi sono i dettagli di implementazione , naturalmente. numpy, proprio come Fortran e altri linguaggi e librerie, fornisce array N-dimensionali - non importa come li implementa "nel profondo" (in realtà numpy è piuttosto in voga, dato che puoi facilmente appiattire e rimodellare gli array - è piuttosto tipico di Python per fornire astrazioni di livello superiore con "ganci" piuttosto buoni su come si relazionano con quelli di livello inferiore ;-).

E.g.,

>>> import numpy 
>>> x = numpy.arange(12) 
>>> x 
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 
>>> x.reshape((3,4)) 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
>>> x.reshape((4,3)) 
array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11]]) 
>>> x.reshape((4,3))[::2, ::2] 
array([[0, 2], 
     [6, 8]]) 
>>> x.reshape((4,3))[(0,1,3), ::2] 
array([[ 0, 2], 
     [ 3, 5], 
     [ 9, 11]]) 
>>> 

È possibile rimodellare, indice fetta e modellare i dati nella matrice N-dimensionale con elevata flessibilità e prestazioni eccellenti - pur sapendo che il blocco di dati di fondo è proprio questo array monodimensionale (qui x nasce e rimane 1-D, ma anche se così non fosse, è possibile ancora accedere all'array 1-D sottostante mediante l'appiattimento).

Questo è il "supporto per array N-dimensionale" significa (sebbene nella maggior parte degli altri linguaggi e framework che offrono tale supporto è possibile ottenere meno trasparenza, funzionalità ridotte o entrambi ;-).

+0

+1 python è bello come al solito ... – stefanB

1

effettivi array in Python - cioè, l'oggetto array creato dal modulo array - sono strettamente unidimensionale. Sono anche qualcosa che probabilmente non userete a meno che il vostro codice non sia interoperabile con le strutture di dati C, state lavorando con enormi quantità di dati che devono essere tenuti in memoria, o scrivete qualcosa come numpy.

Problemi correlati