查看: 134|回复: 3

NumPy数组创建与操作实战:Python科学计算从入门到进阶

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
NumPy是Python科学计算的核心库,其高性能多维数组对象ndarray和向量化运算能大幅提升计算效率。本文将系统讲解NumPy数组的创建、操作、统计、文件IO及高级技巧,适合需要处理数值数据的Python开发者。

一、核心数据结构:ndarray

ndarray是一个同构数据的多维容器。先导入NumPy。
  1. import numpy as np
  2. # 从列表或元组创建一维、二维数组
  3. arr_from_list = np.array([1, 2, 3, 4, 5])
  4. arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
  5. # 特殊数组:全0、全1、满值、单位矩阵、等差数列、等间隔数列
  6. zeros_arr = np.zeros((3, 4))  # 3行4列全0
  7. ones_arr = np.ones((2, 3))   # 2行3列全1
  8. full_arr = np.full((2, 2), 7) # 2x2所有元素为7
  9. eye_arr = np.eye(3)          # 3x3单位矩阵
  10. arange_arr = np.arange(0, 10, 2)  # [0,2,4,6,8]
  11. linspace_arr = np.linspace(0, 1, 5)  # [0., 0.25, 0.5, 0.75, 1.]
复制代码

数组属性是操作基础:
  1. arr = np.array([[1,2,3],[4,5,6]])
  2. print("维度:",arr.ndim)    # 2
  3. print("形状:",arr.shape)  # (2,3)
  4. print("元素总数:",arr.size) # 6
  5. print("数据类型:",arr.dtype) # int64
复制代码

二、数组索引与切片

支持类似Python列表的索引和切片,但多维数组更灵活。
  1. arr = np.array([10,20,30,40,50])
  2. print(arr[0])      # 10
  3. print(arr[-1])     # 50
  4. print(arr[1:4])    # [20 30 40]
  5. print(arr[::2])    # [10 30 50]
  6. # 多维索引与切片
  7. arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
  8. print(arr_2d[0,1])      # 2
  9. print(arr_2d[1])        # [4 5 6]
  10. print(arr_2d[:,1])      # [2 5 8]
  11. print(arr_2d[0:2,1:3])  # [[2 3] [5 6]]
复制代码

三、数组操作与变形

3.1 形状操作
  1. arr = np.arange(12)
  2. print(arr)  # [0 1 2 3 4 5 6 7 8 9 10 11]
  3. reshaped = arr.reshape(3,4)
  4. print(reshaped)
  5. # 展平:flatten返回新数组,ravel返回视图
  6. flattened = reshaped.flatten()
  7. raveled = reshaped.ravel()
  8. print("展平后:",flattened)
  9. print("ravel:",raveled)
  10. # 转置
  11. transposed = reshaped.T
  12. print(transposed)
复制代码

3.2 拼接与分割
  1. a = np.array([[1,2],[3,4]])
  2. b = np.array([[5,6],[7,8]])
  3. # 垂直拼接(沿轴0)
  4. v_stack = np.vstack((a,b))
  5. print("垂直拼接:\n",v_stack)
  6. # 水平拼接(沿轴1)
  7. h_stack = np.hstack((a,b))
  8. print("水平拼接:\n",h_stack)
  9. # 数组分割
  10. arr = np.arange(9).reshape(3,3)
  11. split_arr = np.split(arr,3,axis=0)
  12. print("沿行分割:",split_arr)
复制代码

四、通用函数(ufunc)与广播

通用函数对数组逐元素运算,广播机制允许不同形状数组运算。
  1. arr = np.array([1.0,4.0,9.0])
  2. print("平方根:",np.sqrt(arr))  # [1. 2. 3.]
  3. print("指数:",np.exp(arr))
  4. print("正弦:",np.sin(arr))
  5. # 广播:形状(2,3)与(3,)相加
  6. a = np.array([[1,2,3],[4,5,6]])
  7. b = np.array([10,20,30])
  8. print("广播加法:\n",a+b)  # b被广播为[[10,20,30],[10,20,30]]
复制代码

五、数学与统计函数
  1. arr = np.array([[1,2,3],[4,5,6]])
  2. print("总和:",np.sum(arr))            # 21
  3. print("列和:",np.sum(arr,axis=0))    # [5 7 9]
  4. print("行和:",np.sum(arr,axis=1))    # [6 15]
  5. print("平均值:",np.mean(arr))         # 3.5
  6. print("标准差:",np.std(arr))
  7. print("最小值:",np.min(arr))
  8. print("最大值:",np.max(arr))
  9. print("累积和:",np.cumsum(arr))       # [1 3 6 10 15 21]
  10. print("累积积:",np.cumprod(arr))
复制代码

六、随机数生成

使用random模块,支持多种分布。
  1. np.random.seed(42)  # 设置种子保证可复现
  2. # 均匀分布[0,1)
  3. uniform_arr = np.random.rand(3,4)
  4. uniform_range = np.random.uniform(5.0,10.0,size=(2,3))
  5. # 标准正态分布
  6. normal_arr = np.random.randn(5)
  7. normal_custom = np.random.normal(loc=100,scale=15,size=1000)
  8. # 随机整数[0,10)
  9. int_arr = np.random.randint(0,10,size=7)
  10. # 带概率的随机选择
  11. choices = np.random.choice(['a','b','c','d'],size=10,p=[0.1,0.2,0.3,0.4])
复制代码

七、排序与搜索
  1. arr = np.array([3,1,4,1,5,9,2])
  2. sorted_arr = np.sort(arr)  # 返回新数组
  3. print(sorted_arr)  # [1 1 2 3 4 5 9]
  4. print(arr)         # 原数组不变
  5. arr.sort()         # 原地排序
  6. print(arr)         # [1 1 2 3 4 5 9]
  7. # 多维排序
  8. arr_2d = np.array([[3,1,4],[1,5,9]])
  9. print(np.sort(arr_2d,axis=0))  # 按列排序
  10. print(np.sort(arr_2d,axis=1))  # 按行排序
  11. # 获取排序索引
  12. arr = np.array([30,10,40])
  13. indices = np.argsort(arr)
  14. print(indices)  # [1 0 2]
复制代码

八、文件输入输出

支持文本和二进制格式。
  1. arr = np.array([[1,2,3],[4,5,6]])
  2. # 保存为文本文件(逗号分隔)
  3. np.savetxt('data.txt',arr,delimiter=',',fmt='%d')
  4. # 加载文本文件
  5. loaded = np.loadtxt('data.txt',delimiter=',',dtype=np.int32)
  6. print(loaded)
  7. # 二进制文件保存数据类型和形状
  8. np.save('data_binary.npy',arr)
  9. loaded_bin = np.load('data_binary.npy')
  10. print(loaded_bin)
复制代码

九、高级技巧

9.1 布尔索引与花式索引
  1. arr = np.array([1,2,3,4,5,6])
  2. mask = arr > 3
  3. print(mask)  # [False False False  True  True  True]
  4. print(arr[mask])  # [4 5 6]
  5. print(arr[arr%2==0])  # [2 4 6]
  6. # 花式索引
  7. indices = [0,2,4]
  8. print(arr[indices])  # [1 3 5]
  9. arr_2d = np.arange(12).reshape(3,4)
  10. print(arr_2d[[0,2]])  # 第0和第2行
  11. print(arr_2d[[0,2],[1,3]])  # 取(0,1)和(2,3)位置元素 [1 11]
复制代码

9.2 线性代数运算
  1. a = np.array([[1,2],[3,4]])
  2. b = np.array([[5,6],[7,8]])
  3. dot = np.dot(a,b)  # 等价于 a@b
  4. print("矩阵乘法:\n",dot)
  5. print("转置:\n",a.T)
  6. print("逆矩阵:\n",np.linalg.inv(a))
  7. print("行列式:",np.linalg.det(a))
  8. print("特征值、特征向量:",np.linalg.eig(a))
复制代码

9.3 数组去重与集合运算
  1. arr = np.array([1,2,2,3,4,4,4,5])
  2. print("唯一值:",np.unique(arr))  # [1 2 3 4 5]
  3. print("出现次数(非负整数):",np.bincount(arr))  # 索引为值,元素为次数
  4. a = np.array([1,2,3,4,5])
  5. b = np.array([3,4,5,6,7])
  6. print("交集:",np.intersect1d(a,b))  # [3 4 5]
  7. print("并集:",np.union1d(a,b))      # [1 2 3 4 5 6 7]
  8. print("差集(a-b):",np.setdiff1d(a,b))  # [1 2]
复制代码

以上就是NumPy数组的完整操作指南。掌握这些基础,你就能高效处理数值计算任务。更多NumPy进阶用法可参考官方文档。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: NumPy数组创建与操作实战:Python科学计算从入门到进阶

感谢分享这么全面的NumPy教程!从基础创建到广播机制再到统计函数,覆盖得很系统,对新手和老手都有参考价值。尤其喜欢你把reshape、flatten和ravel的区别讲清楚了,很多人容易在这上面踩坑。另外想问一下,在实际数据处理中,你更倾向于用flatten还是ravel来展平数组?有没有遇到过广播导致数据维度不符合预期的陷阱?期待继续交流!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: NumPy数组创建与操作实战:Python科学计算从入门到进阶

楼主这份NumPy教程写得非常系统,从创建到高级操作都覆盖到了,很适合刚入门科学计算的同学。我个人觉得广播机制那一块如果能再举个三维数组的例子会更直观,比如 (3,1,4) 和 (1,5,4) 广播成 (3,5,4) 的过程。另外,数组切片返回的是视图,修改视图会影响原数组,这一点对新手容易踩坑,楼主有没有遇到过这类问题?
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: NumPy数组创建与操作实战:Python科学计算从入门到进阶

感谢楼主分享这么系统的NumPy教程,从创建到高级操作都讲得很清楚,特别是广播机制的例子很直观,帮我理解了不少之前模糊的地方。我平时也常用NumPy处理数据,想问一下对于超大数组(比如几十GB)没法一次性加载进内存时,有什么推荐的处理方式吗?比如用np.memmap或者配合HDF5?希望楼主能再聊聊这方面的实战经验。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-3 13:03 , Processed in 0.030266 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部