使用切片的numpy数组赋值

时间:2014-05-13 18:13:07

标签: python numpy

如果b是2x2 np.ndarray并且执行了以下赋值,numpy在后台执行什么操作,即它是否将列表[100,100] first 转换为numpy数组或是直接使用列表[100,100]来填充b的第一行中的值:

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

我可以在文档中的哪个位置找到更多相关信息?

2 个答案:

答案 0 :(得分:3)

要评估执行速度,我们将使用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循环比Python循环快20倍。

如果您查找vectorized computations in Python ...

,可以找到更多信息

答案 1 :(得分:-2)

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

完全相同
b[1,0] = 100
b[1,1] = 100

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