2014-05-13 19 views
7

Se b è un 2x2 np.ndarray e viene eseguita la seguente assegnazione, cosa fa numpy in background, ovvero converte la lista [100, 100] prima in una matrice numpy o vuol direttamente utilizzare l'elenco [100,100] per riempire i valori nella prima fila di B:Assegnazione array numpy mediante slicing

b[1,:] = [100,100] 

Dove nella documentazione posso trovare maggiori informazioni su questo?

+0

'numpy' è open source, se siete interessati a come qualcosa * * implementato basta guardare le fonti. – Bakuriu

+2

La risposta è "dipende". Cerca in 'core/src/multiarray/sequence.c' nella distribuzione di Numpy (' array_assign_slice': https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91). Nel tuo esempio, penso che il codice non convertirà la lista in una matrice, ma a seconda degli altri casi, potrebbe. –

+0

@goncalopp sì, sono preoccupato per l'utilizzo della memoria. – methane

risposta

-2

b[1,:] = [100,100] è esattamente lo stesso di

b[1,0] = 100 
b[1,1] = 100 

E 'comunque più veloce da eseguire in quanto utilizza i cicli compilati. (Il secondo deve eseguire una conversione al tipo di carattere ndarray prima di attribuire i valori).

+0

Si trova nella documentazione da qualche parte? In tal caso, potresti fornire un link dove è documentato? Grazie – dg123

+0

Sì, per favore fatemi sapere se è da qualche parte nella documentazione. Cos'è un ciclo compilato? – methane

+0

Ciao, Sto parlando della differenza tra linguaggio interpretato e linguaggio compilato. È noto che Python può essere eseguito comando per comando, a differenza di C o Java che sono compilati. È anche noto che numpy è una sorta di interfaccia che funziona con Python ma viene eseguita come programma compilato. Un esempio delle prestazioni dei loop è dato nella risposta che segue. – Taha

2

Per valutare la velocità di esecuzione, utilizzeremo la libreria timeit.

import timeit 
import numpy as np 

setup = """ 
import numpy as np 
tmp = np.empty(shape=(1, 100)) 
values = [i for i in xrange(100)] 
""" 

stmt1 = """tmp[0, :] = values""" 
stmt2 = """ 
for i, val in enumerate(values): 
    tmp[0, i] = val 
""" 

time1 = timeit.Timer(setup=setup, stmt=stmt1) 
time2 = timeit.Timer(setup=setup, stmt=stmt2) 

print "numpy way :", time1.timeit(number=100000) 
print "Python way:", time2.timeit(number=100000) 

È possibile verificare questo e si noterà che i cicli NumPy sono due volte più veloce:

- numpy way : 0.97758197784423828 
- Python way: 2.1633858680725098 

Questo perché v'è una fase in cui i numeri interi in values (che sono interi illimitati) sono convertiti in float di 64 bit. Al fine di confrontare solo la velocità del loop, la conversione di tipo può essere fatta preliminarmente nel setup:

values = np.array([i for i in xrange(100)], dtype=np.float64) 

Ecco cosa ho ottenuto:

numpy way : 0.131125926971 
Python way: 2.64055013657 

notiamo che i cicli NumPy sono 20 volte più veloce dei loop Python.

Troverete ulteriori informazioni se cercate vectorized computations in Python ...