python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python NumPy数组创建与用法

Python NumPy数组创建与基本用法全攻略

作者:老师好,我是刘同学

NumPy 是 Python 科学计算的核心库,提供高性能的多维数组对象ndarray及大量操作这些数组的函数,本文将带你掌握ndarray的核心操作,希望对大家有所帮助

NumPy 是 Python 科学计算的核心库,提供高性能的多维数组对象 ndarray 及大量操作这些数组的函数。其核心优势在于向量化运算,避免了低效的 Python 循环,从而大幅提升计算效率 。

1. 核心数据结构:ndarray 数组

ndarray 是 NumPy 的基础,它是一个同构数据(相同数据类型)的多维容器。

1.1 数组创建

可以通过多种方式创建数组。

import numpy as np

# 从列表或元组创建
arr_from_list = np.array([1, 2, 3, 4, 5])
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])

# 创建特殊数组
zeros_arr = np.zeros((3, 4)) # 3行4列的全0数组
ones_arr = np.ones((2, 3)) # 2行3列的全1数组
full_arr = np.full((2, 2), 7) # 2x2数组,所有元素为7
eye_arr = np.eye(3) # 3x3单位矩阵
arange_arr = np.arange(0, 10, 2) # 类似range,生成 [0, 2, 4, 6, 8]
linspace_arr = np.linspace(0, 1, 5) # 0到1之间等间隔的5个数 [0., 0.25, 0.5, 0.75, 1.]

1.2 数组属性

了解数组属性是操作的基础。

arr = np.array([[1, 2, 3], [4, 5, 6]])
print("数组维度 (ndim):", arr.ndim) # 2
print("数组形状 (shape):", arr.shape) # (2, 3)
print("数组元素总数 (size):", arr.size) # 6
print("数组数据类型 (dtype):", arr.dtype) # int64 (取决于系统)

2. 数组索引与切片

索引和切片是访问和修改数组数据的主要方式。

arr = np.array([10, 20, 30, 40, 50])

# 基础索引
print(arr[0]) # 10
print(arr[-1]) # 50

# 切片 [start:stop:step]
print(arr[1:4]) # [20 30 40]
print(arr[::2]) # [10 30 50]

# 多维数组索引与切片
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d[0, 1]) # 2,第0行第1列
print(arr_2d[1]) # [4 5 6],第1行
print(arr_2d[:, 1]) # [2 5 8],所有行的第1列
print(arr_2d[0:2, 1:3]) # [[2 3] [5 6]],第0-1行,第1-2列

3. 数组操作与变形

3.1 形状操作

arr = np.arange(12)
print("原数组:", arr) # [0 1 2 3 4 5 6 7 8 9 10 11]

# 改变形状 (reshape),不改变数据
reshaped = arr.reshape(3, 4)
print("重塑为3x4:
", reshaped)

# 展平数组 (ravel或 flatten)
flattened = reshaped.flatten()
print("展平后:", flattened) # 返回新数组
raveled = reshaped.ravel()
print("ravel后:", raveled) # 返回视图(修改会影响原数组)

# 转置 (transpose 或 .T)
transposed = reshaped.T
print("转置后:
", transposed)

3.2 数组拼接与分割

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# 沿轴0(垂直)拼接
v_stack = np.vstack((a, b)) # 或 np.concatenate((a, b), axis=0)
print("垂直拼接:
", v_stack)

# 沿轴1(水平)拼接
h_stack = np.hstack((a, b)) # 或 np.concatenate((a, b), axis=1)
print("水平拼接:
", h_stack)

# 数组分割
arr = np.arange(9).reshape(3, 3)
print("原数组:
", arr)
split_arr = np.split(arr, 3, axis=0) # 沿轴0分成3份
print("沿行分割:", split_arr)

4. 通用函数 (ufunc) 与广播

通用函数对数组进行逐元素运算,广播机制允许不同形状数组进行运算。

# 通用函数示例
arr = np.array([1.0, 4.0, 9.0])
print("平方根:", np.sqrt(arr)) # [1. 2. 3.]
print("指数:", np.exp(arr))
print("正弦:", np.sin(arr))

# 广播机制示例
a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2,3)
b = np.array([10, 20, 30]) # 形状 (3,)
print("广播加法:
", a + b) # b被广播为 [[10,20,30], [10,20,30]]

5. 数学与统计函数

NumPy 提供了丰富的数学和统计函数。

arr = np.array([[1, 2, 3], [4, 5, 6]])

# 聚合函数
print("总和:", np.sum(arr)) # 21
print("沿轴0求和(列和):", np.sum(arr, axis=0)) # [5 7 9]
print("沿轴1求和(行和):", np.sum(arr, axis=1)) # [6 15]
print("平均值:", np.mean(arr)) # 3.5
print("标准差:", np.std(arr))
print("最小值:", np.min(arr))
print("最大值:", np.max(arr))

# 其他数学函数
print("累积和:", np.cumsum(arr)) # [ 1 3 6 10 15 21]
print("累积积:", np.cumprod(arr))

6. 随机数生成

NumPy 的 random 模块是生成随机数的强大工具 。

# 设置随机种子以确保结果可复现
np.random.seed(42)

# 生成均匀分布随机数
uniform_arr = np.random.rand(3, 4) # [0,1)均匀分布,形状3x4
uniform_range = np.random.uniform(low=5.0, high=10.0, size=(2, 3)) # [5,10) 均匀分布

# 生成正态分布随机数
normal_arr = np.random.randn(5) # 标准正态分布 N(0,1)
normal_custom = np.random.normal(loc=100, scale=15, size=1000) # 均值100,标准差15

# 生成随机整数
int_arr = np.random.randint(low=0, high=10, size=7) # [0,10) 的整数

# 从给定数组随机选择
choices = np.random.choice(['a', 'b', 'c', 'd'], size=10, p=[0.1, 0.2, 0.3, 0.4]) # 带概率的随机选择

7. 排序与搜索

sort 函数是 NumPy 中用于数组排序的核心函数 。

arr = np.array([3, 1, 4, 1, 5, 9, 2])

# 返回排序后的新数组
sorted_arr = np.sort(arr) # 默认快速排序
print("排序后(新数组):", sorted_arr) # [1 1 2 3 4 5 9]
print("原数组未变:", arr) # [3 1 4 1 5 9 2]

# 在原数组上排序
arr.sort()
print("原数组已排序:", arr) # [1 1 2 3 4 5 9]

# 多维数组沿指定轴排序
arr_2d = np.array([[3, 1, 4], [1, 5, 9]])
sorted_axis0 = np.sort(arr_2d, axis=0) # 沿轴0(行方向,即按列)排序
print("沿轴0排序:
", sorted_axis0)
sorted_axis1 = np.sort(arr_2d, axis=1) # 沿轴1(列方向,即按行)排序
print("沿轴1排序:
", sorted_axis1)

# 获取排序后元素在原数组中的索引
arr = np.array([30, 10, 40])
indices = np.argsort(arr)
print("排序索引:", indices) # [1 0 2],表示原数组中最小值的索引是1,其次是0,最大是2

8. 文件输入输出

NumPy 可以方便地将数组读写到磁盘文件。

# 保存数组到文件
arr_to_save = np.array([[1, 2, 3], [4, 5, 6]])
np.savetxt('data.txt', arr_to_save, delimiter=',', fmt='%d') # 保存为整数,逗号分隔

# 从文本文件加载数组
# loadtxt 函数功能强大,支持多种参数 
loaded_arr = np.loadtxt('data.txt', delimiter=',', dtype=np.int32)
print("从文件加载的数组:
", loaded_arr)

# 二进制文件读写(更高效,保存数据类型和形状)
np.save('data_binary.npy', arr_to_save) # 保存为 .npy 格式
loaded_binary = np.load('data_binary.npy') # 加载 .npy 文件
print("从二进制文件加载:
", loaded_binary)

9. 实用高级技巧

9.1 布尔索引与花式索引

arr = np.array([1, 2, 3, 4, 5, 6])

# 布尔索引
mask = arr > 3
print("布尔掩码:", mask) # [False False False True True True]
print("条件选择:", arr[mask]) # [4 5 6]
print("直接条件选择:", arr[arr % 2 == 0]) # [2 4 6]

# 花式索引(使用整数数组索引)
indices = [0, 2, 4]
print("花式索引选择:", arr[indices]) # [1 3 5]
arr_2d = np.arange(12).reshape(3, 4)
print("选择特定行:", arr_2d[[0, 2]]) # 第0行和第2行
print("选择特定行列:", arr_2d[[0, 2], [1, 3]]) # (0,1) 和 (2,3) 位置的元素 [1 11]

9.2 线性代数运算

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

# 矩阵乘法
dot_product = np.dot(a, b) # 或 a @ b
print("矩阵乘法:
", dot_product)

# 其他线性代数函数
print("矩阵转置:
", a.T)
print("矩阵求逆:
", np.linalg.inv(a)) # 如果可逆
print("行列式:", np.linalg.det(a))
print("特征值和特征向量:", np.linalg.eig(a))

9.3 数组去重与集合运算

arr = np.array([1, 2, 2, 3, 4, 4, 4, 5])
print("唯一值:", np.unique(arr)) # [1 2 3 4 5]
print("值出现次数:", np.bincount(arr)) # 索引对应值出现的次数(适用于非负整数)

a = np.array([1, 2, 3, 4, 5])
b = np.array([3, 4, 5, 6, 7])
print("交集:", np.intersect1d(a, b)) # [3 4 5]
print("并集:", np.union1d(a, b)) # [1 2 3 4 5 6 7]
print("差集 (a-b):", np.setdiff1d(a, b)) # [1 2]

到此这篇关于Python NumPy数组创建与基本用法全攻略的文章就介绍到这了,更多相关Python NumPy数组创建与用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文