2014-05-13 107 views
7

如果b是一个2×2的np.ndarray并且执行了下面的赋值,numpy会在后台做些什么,也就是说它会将列表[100,100] 第一个转换为numpy数组还是它直接使用列表[100,100],填补了值b的第一行:使用切片的numpy数组赋值

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

的文档中哪里可以找到更多这方面的信息?

+0

你会发现更多的信息'numpy'是开源的,如果你有兴趣在如何的东西是* *实现单看来源。 – Bakuriu

+2

答案是“视情况而定”。查看Numpy发行版中的'core/src/multiarray/sequence.c'('array_assign_slice':https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91 )。在你的例子中,我认为代码不会将列表转换为数组,但根据其他情况,它可能会。 –

+0

@goncalopp是的,我关心内存使用情况。 – methane

回答

-2

b[1,:] = [100,100]是完全一样的

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

然而更快地执行,因为它使用编译循环。 (第二个需要在赋值之前对ndarray dtype进行转换)。

+0

这是在文档的某处吗?如果是这样,你能否提供一个链接到这里记录的地方?谢谢 – dg123

+0

是的,请让我知道它是否在文档中的某处。什么是编译循环? – methane

+0

你好, 我在谈论解释型语言和编译型语言的区别。据了解,Python可以通过命令执行,与编译的C或Java不同。 也是众所周知的,numpy是一种与Python协同工作的接口,但是作为一个编译好的程序运行。下面的答案给出了一个关于循环性能的例子。 – Taha

2

要评估执行速度,我们将使用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) 

您可以测试这一点,你会发现,numpy的循环是快两倍:

- numpy way : 0.97758197784423828 
- Python way: 2.1633858680725098 

这是因为存在这样的情况在values的整数(这是无限的整数)被转换成相64位浮点数。为了只比较循环的速度,类型转换可以预先在安装完成:

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

这是我获得的:

numpy way : 0.131125926971 
Python way: 2.64055013657 

我们注意到,numpy的循环是20倍比Python循环更快。

,如果你找vectorized computations in Python ...