Numpy.zeros和Numpy.zeros_like的性能差异

Numpy.zeros和Numpy.zeros_like的性能差异

众所周知,Numpy是Python中使用最广泛的数值计算库。在数据科学和机器学习等众多领域都有着重要的应用。Numpy有着强大的数组功能,支持高维数组的创建、操作和运算,是在Python语言中进行大规模数值运算的首选库。本文探讨Numpy中的两个函数——numpy.zeros和numpy.zeros_like的性能差异。

阅读更多:Numpy 教程

numpy.zeros和numpy.zeros_like的作用

numpy.zeros和numpy.zeros_like都是用来创建全零数组的函数。

numpy.zeros(shape, dtype=float, order=’C’): 创建一个指定形状(shape)、数据类型(dtype)和采用的存储顺序(order)的以零填充的数组。

例如:

import numpy as np

a = np.zeros((3,4))
print(a)

运行结果如下:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

numpy.zeros_like(a, dtype=None, order=’K’, subok=True, shape=None): 返回与给定数组(a)具有相同形状和类型的全零数组。

例如:

b = np.array([1, 2, -3])
print(b, np.zeros_like(b))

c = np.array([[1, 2, -3],[4,5,6]])
print(c, np.zeros_like(c))

运行结果如下:

[ 1  2 -3] [0 0 0]
[[ 1  2 -3]
 [ 4  5  6]] [[0 0 0]
 [0 0 0]]

numpy.zeros和numpy.zeros_like的性能差异

在实际应用中,我们需要比较这两个函数的性能。我们在终端窗口中使用timeit命令进行测试。

import numpy as np
import timeit

a = np.random.random(100)
%timeit np.zeros(a.shape)
%timeit np.zeros_like(a)

运行结果如下所示:

The slowest run took 25.87 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.63 µs per loop
The slowest run took 7.88 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 6.19 µs per loop

可以看出,numpy.zeros的运行时间比numpy.zeros_like略快。这是为什么呢?

原因在于numpy.zeros可以直接指定数组的形状,所以不需要进行额外的计算和处理。而numpy.zeros_like需要先计算出要创建的全零数组的形状,才能进一步创建。

同时,numpy.zeros_like还需要传入一个原数组作为模板,这意味着numpy.zeros_like要额外进行数据类型转换等操作。

指定数据类型的差异

numpy.zeros和numpy.zeros_like对于数据类型的处理上还有一些差异。

对于numpy.zeros,我们可以通过dtype参数来指定数组的数据类型。dtype既可以是Python内置类型,也可以是Numpy中的数据类型对象。

例如:

import numpy as np

a = np.zeros((3,4), dtype=int)
print(a)

运行结果如下:

[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]

对于numpy.zeros_like,该函数会继承原数组的数据类型。

例如:

import numpy as np

a = np.array([1, 2, 3])
b = np.zeros_like(a)
print(b, b.dtype)

c = np.array([1.2, 3.4, -6.7])
d = np.zeros_like(c)
print(d, d.dtype)

运行结果如下:

[0 0 0] int64
[0. 0. 0.] float64

可以看到,numpy.zeros_like会继承原数组的数据类型。如果原数组的数据类型发生改变,则创建的全零数组的数据类型也会改变。需要注意的是,如果原数组的数据类型不是Numpy支持的类型,则numpy.zeros_like会忽略dtype参数,创建一个默认的float类型数组。

总结

本文讨论了Numpy中的两个函数——numpy.zeros和numpy.zeros_like的性能差异。经过测试,我们发现numpy.zeros的运行速度比numpy.zeros_like快。这是由于numpy.zeros可以直接指定数组的形状,而numpy.zeros_like需要先计算形状才能进行数组的创建。numpy.zeros_like还需要传入原数组作为模板,同时会继承原数组的数据类型,如果原数组的数据类型发生改变,则创建的全零数组的数据类型也会改变。在实际应用中,我们可以根据应用需求进行选择。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程