目录:
NumPy 提供了一个强大的多维数组对象 ndarray 以及一系列用于高效操作这些数组的函数,在数据科学、机器学习、工程计算等领域非常常用。
NumPy 的核心设计目标是高性能。其 ndarray 对象在内存中以连续块存储同类型数据,底层运算由优化的 C 和 Fortran 代码实现,避免了 Python 解释器循环的开销。这使得 NumPy 在处理大规模数值计算时,速度通常比纯 Python 列表快 10 到 100 倍甚至更多,同时内存占用也更小。例如,对百万级数组求和,NumPy 耗时约 0.0005秒,而纯 Python 列表求和约需0.05秒。
安装
$ pip3 install numpy
安装完成后,通过如下代码验证:
import numpy as np
print(np.__version__) # 打印 NumPy 版本号
在 Python 社区,通常使用 import numpy as np 作为标准导入方式,np 已成为公认的别名,使代码更简洁。
import numpy as np
# 1. 从 Python 列表或元组创建
arr_from_list = np.array([1, 2, 3, 4, 5])
print(f'arr_from_list: {arr_from_list}')
arr_from_nested_list = np.array([[1, 2, 3], [4, 5, 6]])
print(f'arr_from_nested_list: {arr_from_nested_list}')
# 2. 创建具有初始占位符的数组(高效预分配内存)
zeros_arr = np.zeros((3, 4)) # 创建 3 行 4 列的全 0 数组
print(f'zeros_arr: {zeros_arr}')
ones_arr = np.ones((2, 3), dtype=np.int32) # 创建全 1 数组,并指定数据类型
print(f'ones_arr: {ones_arr}')
empty_arr = np.empty((2, 3)) # 创建未初始化的数组,内容为内存残留值
print(f'empty_arr: {empty_arr}')
# 3. 创建数字序列
seq_arr = np.arange(5) # 类似 range,生成 [0, 1, 2, 3, 4]
print(f'seq_arr: {seq_arr}')
linspace_arr = np.linspace(0, 10, 5) # 在 0 到 10 之间生成 5 个等间距数 [0., 2.5, 5., 7.5, 10.]
print(f'linspace_arr: {linspace_arr}')
# 4. 创建特殊矩阵
eye_matrix = np.eye(3) # 创建 3x3 的单位矩阵
print(f'eye_matrix: {eye_matrix}')
full_matrix = np.full((3, 3), 6, dtype='complex') # 创建 3x3 且所有元素为 6 的复数数组
print(f'full_matrix: {full_matrix}')
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print("数组类型:", type(arr)) # <class 'numpy.ndarray'>
print("数组维度(ndim):", arr.ndim) # 2
print("数组形状(shape):", arr.shape) # (2, 3) -> 2行3列
print("元素总数(size):", arr.size) # 6
print("元素类型(dtype):", arr.dtype) # int64
import numpy as np
arr = np.arange(12).reshape(3, 4) # 创建 3x4 数组 [[0,1,2,3], [4,5,6,7], [8,9,10,11]]
# 基础索引与切片
print(arr[1, :]) # 获取第2行(索引1): [4 5 6 7]
print(arr[:, 1::2]) # 获取所有行,从第 2 列开始每隔一列取一列
# 布尔索引:通过条件筛选元素
mask = arr > 5
print(arr[mask]) # 获取所有大于5的元素: [ 6 7 8 9 10 11]
# 花式索引:使用整数数组索引
print(arr[[0, 2], [1, 3]]) # 取(0,1)和(2,3)位置的元素: [ 1 11]
可以方便地改变数组的形状,但需保证变形前后元素总数不变。
import numpy as np
arr = np.array([[1, 2], [3, 4]])
# 调整形状
reshaped = arr.reshape(4, 1) # 变为4行1列 [[1], [2], [3], [4]]
print(f'reshaped: {reshaped}')
# 转置
transposed = arr.T # 行变列,列变行 [[1, 3], [2, 4]]
print(f'transposed: {transposed}')
# 展平为一维数组
flattened_c = arr.flatten(order='C') # 按行优先展平(默认): [1, 2, 3, 4]
flattened_f = arr.flatten(order='F') # 按列优先展平: [1, 3, 2, 4]
print(f'flattened_c: {flattened_c}')
print(f'flattened_f: {flattened_f}')
# 数组拼接
new_arr = np.vstack([arr, [[5, 6]]]) # 垂直堆叠,变为 3x2 数组
print(f'new_arr: {new_arr}')
NumPy 的核心魅力在于矢量化,即对整个数组执行运算而无需编写显式循环,这带来了巨大的性能提升。
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 元素级运算
print(a + b) # [5 7 9]
print(a * 2) # [2 4 6]
print(a > 1) # [False True True]
广播是 NumPy 的一项强大规则,它允许不同形状的数组进行算术运算。系统会自动将较小的数组”广播”到较大数组的形状,以便它们具有兼容的维度。
import numpy as np
matrix = np.ones((3, 3)) # 3x3全1矩阵
row_vector = np.array([1, 2, 3]) # 1x3行向量
print(f'row_vector: {row_vector}')
# 行向量被广播到与矩阵相同的形状,然后执行加法
result = matrix + row_vector
print(f'result: {result}')
# 等价于 matrix + [[1,2,3], [1,2,3], [1,2,3]]
# 结果: [[2., 3., 4.], [2., 3., 4.], [2., 3., 4.]]
聚合函数,可以快速计算数组的统计特征,并支持按指定轴(维度)进行计算。
import numpy as np
arr = np.array([[1, 2], [3, 4]])
print(np.sum(arr)) # 全局求和: 10
print(np.mean(arr, axis=0)) # 沿第0轴(列)求均值: [2. 3.]
print(np.std(arr)) # 全局标准差: 1.118033988749895
print(np.median(arr)) # 中位数: 2.5
虽然 ndarray 大小固定,但 NumPy 仍提供了函数来返回修改后的新数组。
import numpy as np
arr = np.array([1, 2, 3])
# 添加元素
arr_appended = np.append(arr, [4, 5]) # 在末尾添加: [1 2 3 4 5]
print(f'arr_appended: {arr_appended}')
arr_inserted = np.insert(arr, 1, 0) # 在索引 1 处插入 0: [1 0 2 3]
print(f'arr_inserted: {arr_inserted}')
# 删除元素
arr_deleted = np.delete(arr, 1) # 删除索引 1 的元素: [1 3]
print(f'arr_deleted: {arr_deleted}')
# 修改元素(通过索引直接赋值是原地操作)
arr[1] = 4 # 将索引 1 的元素改为 4: [1 4 3]
print(f'arr: {arr}')
# 条件修改
arr_cond = np.array([1, 2, 3, 4])
np.place(arr_cond, arr_cond > 2, arr_cond[arr_cond > 2] * 2) # 大于 2 的元素乘以 2: [1 2 6 8]
print(f'arr_cond: {arr_cond}')
↶ 返回首页 ↶