如果b是一个2x2的np.ndarray并执行以下赋值操作,那么numpy在后台会做什么,即它是否将列表[100, 100] 首先转换为numpy数组,还是直接使用列表[100, 100]来填充b的第一行的值:
b[1,:] = [100,100]
在文档中我可以在哪里找到更多关于此事的信息?
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 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
b[1,:] = [100,100]
与
b[1,0] = 100
b[1,1] = 100
然而,由于它使用编译循环,因此执行速度更快。 (第二个需要在分配值之前将其转换为ndarray dtype)。
numpy
是开源的,如果你对某个实现方式感兴趣,只需查看源代码即可。 - Bakuriucore/src/multiarray/sequence.c
(array_assign_slice
:https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91)。在您的示例中,我认为代码不会将列表转换为数组,但根据其他情况可能会。 - Alok Singhala = numpy.empty((2,3)); a[:] = range(3)
。我可能错了。 - Alok Singhal