使用切片赋值numpy数组
如果 b 是一个 2x2 的 np.ndarray(也就是一个二维数组),当你执行下面的赋值操作时,numpy 在后台到底做了什么?也就是说,它是先把列表 [100, 100] 转换成一个 numpy 数组,然后再填充到 b 的第一行,还是直接用列表 [100, 100] 的值来填充 b 的第一行呢?
b[1,:] = [100,100]
我可以在文档的哪个地方找到更多关于这个的资料呢?
2 个回答
-2
b[1,:] = [100,100]
和下面的写法是完全一样的:
b[1,0] = 100
b[1,1] = 100
不过,前者执行起来更快,因为它使用了编译好的循环。后者在赋值之前需要先把数据转换成ndarray的类型,这样会稍微慢一些。
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倍。
如果你想了解更多信息,可以查找 Python中的向量化计算 ...