这篇文章讨论了安装 NumPy,然后创建、读取和排序 NumPy 数组。
NumPy(即 Numerical Python)是一个库,它使得在 Python 中对线性数列和矩阵进行统计和集合操作变得容易。我在 Python 数据类型的笔记中介绍过,它比 Python 的列表快几个数量级。NumPy 在数据分析和科学计算中使用得相当频繁。
我将介绍安装 NumPy,然后创建、读取和排序 NumPy 数组。NumPy 数组也被称为 ndarray,即 N 维数组的缩写。
安装 NumPy
使用 pip
安装 NumPy 包非常简单,可以像安装其他软件包一样进行安装:
pip install numpy
安装了 NumPy 包后,只需将其导入你的 Python 文件中:
import numpy as np
将 numpy
以 np
之名导入是一个标准的惯例,但你可以不使用 np
,而是使用你想要的任何其他别名。
为什么使用 NumPy? 因为它比 Python 列表要快好几个数量级
当涉及到处理大量的数值时,NumPy 比普通的 Python 列表快几个数量级。为了看看它到底有多快,我首先测量在普通 Python 列表上进行 min()
和 max()
操作的时间。
我将首先创建一个具有 999,999,999 项的 Python 列表:
>>> my_list = range(1, 1000000000)
>>> len(my_list)
999999999
现在我将测量在这个列表中找到最小值的时间:
>>> start = time.time()
>>> min(my_list)
1
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 27007.00879096985
这花了大约 27,007 毫秒,也就是大约 27 秒。这是个很长的时间。现在我试着找出寻找最大值的时间:
>>> start = time.time()
>>> max(my_list)
999999999
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 28111.071348190308
这花了大约 28,111 毫秒,也就是大约 28 秒。
现在我试试用 NumPy 找到最小值和最大值的时间:
>>> my_list = np.arange(1, 1000000000)
>>> len(my_list)
999999999
>>> start = time.time()
>>> my_list.min()
1
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 1151.1778831481934
>>>
>>> start = time.time()
>>> my_list.max()
999999999
>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000))
Time elapsed in milliseconds: 1114.8970127105713
找到最小值花了大约 1151 毫秒,找到最大值 1114 毫秒。这大约是 1 秒。
正如你所看到的,使用 NumPy 可以将寻找一个大约有 10 亿个值的列表的最小值和最大值的时间 从大约 28 秒减少到 1 秒。这就是 NumPy 的强大之处。
使用 Python 列表创建 ndarray
有几种方法可以在 NumPy 中创建 ndarray。
你可以通过使用元素列表来创建一个 ndarray:
>>> my_ndarray = np.array([1, 2, 3, 4, 5])
>>> print(my_ndarray)
[1 2 3 4 5]
有了上面的 ndarray 定义,我将检查几件事。首先,上面定义的变量的类型是 numpy.ndarray
。这是所有 NumPy ndarray 的类型:
>>> type(my_ndarray)
这里要注意的另一件事是 “ 形状 shape ”。ndarray 的形状是 ndarray 的每个维度的长度。你可以看到,my_ndarray
的形状是 (5,)
。这意味着 my_ndarray
包含一个有 5 个元素的维度(轴)。
>>> np.shape(my_ndarray)
(5,)
数组中的维数被称为它的 “ 秩 rank ”。所以上面的 ndarray 的秩是 1。
我将定义另一个 ndarray my_ndarray2
作为一个多维 ndarray。那么它的形状会是什么呢?请看下面:
>>> my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)])
>>> np.shape(my_ndarray2)
(2, 3)
这是一个秩为 2 的 ndarray。另一个要检查的属性是 dtype
,也就是数据类型。检查我们的 ndarray 的 dtype
可以得到以下结果:
>>> my_ndarray.dtype
dtype('int64')
int64
意味着我们的 ndarray 是由 64 位整数组成的。NumPy 不能创建混合类型的 ndarray,必须只包含一种类型的元素。如果你定义了一个包含混合元素类型的 ndarray,NumPy 会自动将所有的元素类型转换为可以包含所有元素的最高元素类型。
例如,创建一个 int
和 float
的混合序列将创建一个 float64
的 ndarray:
>>> my_ndarray2 = np.array([1, 2.0, 3])
>>> print(my_ndarray2)
[1. 2. 3.]
>>> my_ndarray2.dtype
dtype('float64')
另外,将其中一个元素设置为 string
将创建 dtype
等于 >> my_ndarray2 = np.array([1, '2', 3])
>>> print(my_ndarray2)
['1' '2' '3']
>>> my_ndarray2.dtype
dtype('