NumPy
了解一个实用的Python库:NumPy。NumPy由多种数据结构组成,能够帮助更快速、更高效地完成任务。
NumPy 是为支持 Python 中的科学计算而创建的。该库允许用户创建 N 维数组,还支持在 NumPy 对象上进行线性代数运算,并提供其他高级数学函数,例如傅里叶变换。

NumPy 可以通过 pip 安装。安装 NumPy 的命令如下:
1pip install numpy
NumPy 中的数组广泛用于通用任务。数组由相同类型的数据元素组成。数组的维度数量称为数组的秩。NumPy 数组的元素通过方括号访问。
What is the difference between numpy.array and python.array?
面试问题:
面试问题:
以下代码比较了 NumPy 数组与 Python 数组:
1# 导入所需库 2import numpy 3import time 4from array import array 5 6# 使用 NumPy 数组的函数 7def numpy_array(n): 8 start_time = time.time() 9 10 # 创建空的 NumPy 数组 11 p = numpy.empty(n) 12 13 # 为每个元素赋值 14 for i in range(n): 15 p[i] = i 16 end_time = time.time() 17 18 # 计算时间差 19 return end_time - start_time 20 21# 使用 Python 数组的函数 22def python_array(n): 23 start_time = time.time() 24 25 # 创建 Python 数组 26 p = array('d') 27 28 # 为每个元素赋值 29 for i in range(n): 30 p.append(i) 31 end_time = time.time() 32 33 # 计算时间差 34 return end_time - start_time 35 36print('NumPy 数组耗时:', round(numpy_array(10000000), 2), ' 秒。') 37print('Python 数组耗时:', round(python_array(10000000), 2), ' 秒。')
如上所示,我们编写了两个函数:numpy_array() 和 python_array()。我们传入参数 n,分别创建长度为 n 的 NumPy 数组和 Python 数组。运行上述代码后,可以明显看出两者在速度上的差异。
What is the difference between a Python list and a NumPy array?
面试问题:
面试问题:
以下代码比较了 Python 列表与 NumPy 数组:
1# 导入所需库 2import numpy 3import time 4size_of_vec = 1000000 5 6# 使用 Python 列表的函数 7def python_list_v(): 8 start_time = time.time() 9 X = range(size_of_vec) 10 Y = range(size_of_vec) 11 Z = [X[i] + Y[i] for i in range(len(X))] 12 return time.time() - start_time 13 14# 使用 NumPy 数组的函数 15def numpy_array_v(): 16 start_time = time.time() 17 X = numpy.arange(size_of_vec) 18 Y = numpy.arange(size_of_vec) 19 Z = X + Y 20 return time.time() - start_time 21 22print('NumPy 数组耗时:', round(numpy_array_v(), 2), ' 秒。') 23print('Python 列表耗时:', round(python_list_v(), 2), ' 秒。')
从上述代码可以看出,我们创建了两个长度相同的对象并将其相加得到第三个对象。Python 列表的执行速度远低于 NumPy 数组。
创建数组
以下示例展示了如何使用列表和元组创建 NumPy 数组:
1import numpy 2 3# 使用 Python 列表创建一维数组 4arr = numpy.array([1, 2, 3]) 5print("一维数组:", arr) 6 7# 使用 Python 列表创建二维数组 8arr = numpy.array([[1, 2, 3], 9 [4, 5, 6]]) 10print("二维数组:", arr) 11 12# 使用元组创建数组 13arr = numpy.array((1, 2, 3)) 14print("来自元组的数组:", arr)
上述代码展示了多种创建 NumPy 数组的方法。
数组索引
NumPy 数组支持切片、整数数组索引和布尔数组索引。
以下示例演示了数组索引的用法:
1import numpy 2 3# 创建数组 4arr = numpy.array([[1, 2, 3, 4], 5 [5, -6, 7, -8], 6 [9, 10, -11, -12]]) 7 8# 切片操作 9sliced_array = arr[1:, ::2] 10print("取后两行及每隔一列的元素:", sliced_array) 11 12# 整数数组索引 13integer_indexing_array = arr[[0, 1, 2], [3, 2, 1]] 14print("位置 (0, 3), (1, 2), (2, 1) 处的元素:", integer_indexing_array) 15 16# 布尔数组索引 17condition = arr > 2 18boolean_indexing_array = arr[condition] 19print("大于 2 的元素:", boolean_indexing_array)
上述代码展示了数组切片的用法。布尔数组索引可用于根据条件筛选数据。
基本数组操作
接下来我们介绍一些基本的数组操作。我们不会深入探讨 NumPy 数组的细节,而是通过基础示例帮助你熟悉常用功能。1import numpy 2 3# 第一个数组 4arr1 = numpy.array([[1, 2], [3, 4]]) 5 6# 第二个数组 7arr2 = numpy.array([[5, 6], [7, 8]]) 8 9# 数组相加 10sum_of_array = numpy.add(arr1, arr2) 11print("两个数组相加:", sum_of_array) 12 13# 求所有数组元素之和 14sum_array_elements = numpy.sum(arr1) 15print("数组元素总和:", sum_array_elements) 16 17# 求数组的迹 18trace_array = numpy.trace(arr1) 19print("数组的迹:", trace_array) 20 21# 求数组元素的平方根 22sqrt_arry = numpy.sqrt(arr1) 23print("\n数组元素的平方根:", sqrt_arry) 24 25# 求数组的转置 26trans_arry = arr1.T 27print("数组的转置:", trans_arry)
上述代码展示了数组加法、迹、平方根和转置等操作的示例。
How can we extract numbers within a range from a NumPy array?
面试问题:
面试问题:
1import numpy 2arr = numpy.arange(20) 3 4# 使用 where 5index = numpy.where((arr >= 7) & (arr <= 14)) 6print(arr[index]) 7 8# 使用逻辑与 9index = numpy.where(numpy.logical_and(arr >= 7, arr <= 14)) 10print(arr[index]) 11 12# 直接在数组上应用条件 13new_arr = arr[(arr >= 7) & (arr <= 14)] 14print(new_arr)
也可以这样实现:
1import numpy 2arr = numpy.arange(5) 3print('原始数组:', arr) 4rev_arr = arr[::-1] 5print('反转数组:', rev_arr)
我们可以将每个类别映射为一个数字。例如:
1import numpy 2category = ['Small', 'Large', 'Medium', 'Large', 'Medium', 'Small', 'Small'] 3category_array = numpy.array(category) 4print('分类数组:', category_array) 5label_map = {'Small': 1, 'Medium': 2, 'Large': 3} 6numeric_array = numpy.array([label_map[x] for x in category_array]) 7print('数值数组:', numeric_array)
以下是一个示例:
1import numpy 2arr = numpy.array([[1, 2, 3, 4], 3 [5, -6, 7, -8], 4 [9, 10, -11, -12]]) 5print('按行求最大值:', numpy.amax(arr, axis=1)) 6print('按列求最大值:', numpy.amax(arr, axis=0))
有关 NumPy 数组的更多详细信息,请参考 https://numpy.org/
Quiz
如何反转 NumPy 数组元素?