determinante - prodotto vettore matrice python




Quali sono le differenze tra array e matrici numpy? Quale dovrei usare? (3)

Come altri hanno già detto, forse il vantaggio principale della matrix era che forniva una notazione conveniente per la moltiplicazione della matrice.

Tuttavia, in Python 3.5 esiste finalmente un operatore infisso dedicato per la moltiplicazione della matrice : @ .

Con le recenti versioni di NumPy, può essere utilizzato con ndarray s:

A = numpy.ones((1, 3))
B = numpy.ones((3, 3))
A @ B

Quindi oggigiorno, ancor più, in caso di dubbio, dovresti attenersi a ndarray .

Quali sono i vantaggi e gli svantaggi di ciascuno?

Da quello che ho visto, uno può funzionare come sostituto dell'altro se necessario, quindi dovrei preoccuparmi di usarli entrambi o dovrei limitarmi a uno solo di essi?

Lo stile del programma influenzerà la mia scelta? Sto facendo un po 'di apprendimento automatico usando numpy, quindi ci sono davvero molte matrici, ma anche molti vettori (matrici).


Le matrici di Numpy sono strettamente bidimensionali, mentre le matrici di numpy (ndarrays) sono N-dimensionali. Gli oggetti Matrix sono una sottoclasse di ndarray, quindi ereditano tutti gli attributi e i metodi di ndarrays.

Il vantaggio principale delle matrici di numpy è che forniscono una notazione conveniente per la moltiplicazione della matrice: se a e b sono matrici, allora a * b è il loro prodotto matrice.

import numpy as np

a=np.mat('4 3; 2 1')
b=np.mat('1 2; 3 4')
print(a)
# [[4 3]
#  [2 1]]
print(b)
# [[1 2]
#  [3 4]]
print(a*b)
# [[13 20]
#  [ 5  8]]

D'altra parte, a partire da Python 3.5, NumPy supporta la moltiplicazione della matrice infissa usando l'operatore @ , quindi è possibile ottenere la stessa convenienza della moltiplicazione della matrice con ndarrays in Python> = 3.5.

import numpy as np

a=np.array([[4, 3], [2, 1]])
b=np.array([[1, 2], [3, 4]])
print([email protected])
# [[13 20]
#  [ 5  8]]

Entrambi gli oggetti matrice e ndarrays hanno .T per restituire la trasposizione, ma gli oggetti matrice hanno anche .H per la trasposizione coniugata, e .I per l'inverso.

Al contrario, gli array di numpy rispettano coerentemente la regola che le operazioni vengono applicate in base agli elementi (tranne che per il nuovo operatore @ ). Quindi, se a e b sono array numpy, allora a*b è la matrice formata moltiplicando le componenti in base agli elementi:

c=np.array([[4, 3], [2, 1]])
d=np.array([[1, 2], [3, 4]])
print(c*d)
# [[4 6]
#  [6 4]]

Per ottenere il risultato della moltiplicazione della matrice, si utilizza np.dot (o @ in Python> = 3.5, come mostrato sopra):

print(np.dot(c,d))
# [[13 20]
#  [ 5  8]]

L'operatore ** si comporta anche in modo diverso:

print(a**2)
# [[22 15]
#  [10  7]]
print(c**2)
# [[16  9]
#  [ 4  1]]

Poiché a è una matrice, a**2 restituisce il prodotto matrice a*a . Poiché c è un narray, c**2 restituisce un narray con ciascun componente al quadrato in base agli elementi.

Esistono altre differenze tecniche tra gli oggetti matrice e ndarrays (che hanno a che fare con np.ravel, selezione degli oggetti e comportamento delle sequenze).

Il vantaggio principale degli array di numpy è che sono più generali delle matrici bidimensionali. Cosa succede quando vuoi un array tridimensionale? Quindi devi usare un narray, non un oggetto matrice. Quindi, imparare a usare gli oggetti matrix è più lavoro - devi imparare le operazioni con gli oggetti matrice e le operazioni di narray.

Scrivere un programma che usi sia matrici sia array rende la vita difficile perché devi tenere traccia di quale tipo di oggetto sono le tue variabili, per evitare che la moltiplicazione restituisca qualcosa che non ti aspetti.

Al contrario, se si attaccano esclusivamente a ndarrays, allora si può fare tutto ciò che gli oggetti matrice possono fare, e altro ancora, tranne con funzioni / notazioni leggermente diverse.

Se sei disposto a rinunciare all'attrattiva visiva della notazione del prodotto della matrice NumPy (che può essere raggiunta con la stessa eleganza con ndarrays in Python> = 3.5), allora penso che gli array NumPy siano decisamente la strada da percorrere.

PS. Naturalmente, non è necessario sceglierne uno a scapito dell'altro, dal momento che np.asmatrix e np.asarray consentono di convertirne uno (purché l'array sia bidimensionale).

C'è una sinossi delle differenze tra gli arrays NumPy e le arrays NumPy here .


Scipy.org consiglia di utilizzare gli array:

* 'array' o 'matrice'? Quale dovrei usare? - Risposta breve

Usa gli array.

  • Sono il tipo standard di vettore / matrice / tensore di numpy. Molte funzioni di numpy restituiscono array, non matrici.

  • C'è una chiara distinzione tra operazioni a elementi e operazioni di algebra lineare.

  • Puoi avere vettori standard o vettori riga / colonna, se lo desideri.

L'unico svantaggio dell'uso del tipo di array è che dovrete usare dot invece di * per moltiplicare (ridurre) due tensori (prodotto scalare, moltiplicazione vettoriale di matrice ecc.).





numpy