2014-05-13 16 views
7

b 2x2 np.ndarray ise ve aşağıdaki atama gerçekleştirilirse, numpy arka planda ne yapar, yani bir sayı dizisine [100, 100] ilk dönüştürür mü yoksa doğrudan b ilk sıradaki değerleri doldurmak için listeyi [100100] kullanmak kapsamaz:Dilimleme özelliğini kullanarak numpy dizi ataması

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

nerede belgelerinde bu konuda daha fazla bilgi bulabilirim?

+0

için bakarsak

Sen daha fazla bilgi bulabilirsiniz bir şey * * Sadece kaynaklardan bakmak nasıl uygulandığını ilgileniyorsanız 'numpy' açık kaynak vardır. – Bakuriu

+2

Cevap "buna bağlıdır". Numpy dağıtımında 'core/src/multiarray/sequence.c' dosyasına bakın ('array_assign_slice': https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91). Örneğinizde, kodun listeyi bir diziye dönüştürmeyeceğini düşünüyorum, ancak diğer durumlara bağlı olarak olabilir. –

+0

@goncalopp evet hafıza kullanımı konusunda endişeliyim. – methane

cevap

-2

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

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

o derlenmiş döngüler kullanır Ancak daha hızlı yürütülecek olan aynıdır. (İkincisi, değerleri iliştirmeden önce ndarray dtype'a bir dönüştürme yapmak zorundadır).

+0

Bu belge bir yerlerde mi var? Eğer öyleyse, bunun belgelendiği yer için bir link verebilir misiniz? Teşekkürler – dg123

+0

Evet, belgelerinizde bir yer varsa lütfen bana bildirin. Derlenmiş bir döngü nedir? – methane

+0

Merhaba, Ben yorumlanmış dil ile derlenmiş dil arasındaki farktan bahsediyorum. Python'un, derlenen C veya Java'dan farklı olarak komutla komut çalıştırılabileceği bilinmektedir. Ayrıca, numpy'nin Python ile çalışan ancak derlenmiş bir program olarak çalışan bir çeşit arabirim olduğu da bilinmektedir. Döngü performansıyla ilgili bir örnek, aşağıdaki cevapta verilmektedir. – Taha

2

Yürütme hızını değerlendirmek için timeit kitaplığını kullanacağız.

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) 

Bunu test edebilirsiniz ve bu numpy döngüler iki kez daha hızlı olduğunu fark edecektir:

- numpy way : 0.97758197784423828 
- Python way: 2.1633858680725098 

(sınırsız tam sayılardır) values içinde tamsayılar dönüştürülür bir faz orada olmasıdır 64 biti yüzer.

numpy way : 0.131125926971 
Python way: 2.64055013657 

Biz numpy döngüler 20 kez olduğunu fark:

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

Edindiğim budur: döngü sadece hızını karşılaştırmak için, tip dönüşüm kurulumunda ön yapılabilir Python döngülerinden daha hızlı. Eğer vectorized computations in Python ...