当前位置: 首页 > news >正文

Numpy 1 - ace-

好的,以下为你整理的全部内容:代码示例 + 高频面试题 + 循序渐进的练习计划


第一部分:各阶段代码示例

阶段一:基础认知

import numpy as np# Python 列表 vs NumPy 数组
py_list = [1, 2, 3, 4, 5]
np_arr = np.array([1, 2, 3, 4, 5])print(py_list * 2)       # [1, 2, 3, 4, 5, 1, 2, 3, 4, 5](重复)
print(np_arr * 2)        # [2 4 6 8 10](逐元素运算)# 性能对比
import time
big_list = list(range(1000000))
big_arr = np.arange(1000000)start = time.time()
sum([x*2 for x in big_list])
print("列表用时:", time.time() - start)start = time.time()
np.sum(big_arr * 2)
print("NumPy用时:", time.time() - start)

阶段二:数组基础

import numpy as np# 创建数组
a = np.array([1, 2, 3])
z = np.zeros((3, 4))
o = np.ones((2, 3))
e = np.empty((2, 2))
r = np.arange(0, 10, 2)          # [0 2 4 6 8]
l = np.linspace(0, 1, 5)         # [0. 0.25 0.5 0.75 1.]
rand_arr = np.random.rand(3, 2)  # 均匀分布
randn_arr = np.random.randn(3, 2) # 标准正态分布
randint_arr = np.random.randint(0, 10, (3, 3))# 数组属性
print(a.shape)    # (3,)
print(z.ndim)     # 2
print(o.size)     # 6
print(a.dtype)    # int64# 类型转换
b = a.astype(np.float64)# 重塑
arr = np.arange(12)
print(arr.reshape(3, 4))
print(arr.reshape(3, -1))  # 自动计算列数
print(arr.flatten())
print(arr.ravel())         # 返回视图,不复制

阶段三:索引与切片

import numpy as nparr = np.arange(12).reshape(3, 4)
print(arr)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]# 基本索引
print(arr[1, 2])       # 6
print(arr[0, :])       # [0 1 2 3]
print(arr[:, 1])       # [1 5 9]
print(arr[0:2, 1:3])
# [[1 2]
#  [5 6]]# 布尔索引
print(arr[arr > 5])    # [6 7 8 9 10 11]
arr[arr > 5] = 0
print(arr)# 花式索引
arr2 = np.arange(12).reshape(3, 4)
print(arr2[[0, 2]])     # 第0行和第2行
print(arr2[:, [1, 3]])  # 第1列和第3列

阶段四:数组运算

import numpy as npa = np.array([1, 2, 3])
b = np.array([4, 5, 6])# 算术运算
print(a + b)   # [5 7 9]
print(a * b)   # [4 10 18]
print(a ** 2)  # [1 4 9]# 通用函数
print(np.sqrt(a))  # [1. 1.414 1.732]
print(np.exp(a))   # [2.718 7.389 20.086]# 统计运算
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr))          # 21
print(np.sum(arr, axis=0))  # [5 7 9] 每列求和
print(np.sum(arr, axis=1))  # [6 15]  每行求和
print(np.mean(arr, axis=1)) # [2. 5.]
print(np.std(arr))          # 标准差
print(np.min(arr), np.max(arr))
print(np.argmin(arr), np.argmax(arr))  # 返回索引# 广播机制
a = np.array([[1, 2, 3], [4, 5, 6]])  # (2, 3)
b = np.array([10, 20, 30])            # (3,)
print(a + b)
# [[11 22 33]
#  [14 25 36]]

阶段五:线性代数

import numpy as npA = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵乘法
print(np.dot(A, B))
print(A @ B)           # Python 3.5+ 推荐写法# 逆矩阵
inv_A = np.linalg.inv(A)
print(inv_A)
print(A @ inv_A)       # 接近单位矩阵# 行列式
print(np.linalg.det(A))# 特征值与特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)# 解线性方程组: 2x + y = 5, x + y = 3
coeff = np.array([[2, 1], [1, 1]])
const = np.array([5, 3])
solution = np.linalg.solve(coeff, const)
print("解:", solution)  # x=2, y=1

阶段六:数组操作进阶

import numpy as npa = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])# 拼接
print(np.concatenate([a, b], axis=0))  # 垂直拼接
print(np.vstack([a, b]))
print(np.hstack([a, b.T]))# 拆分
arr = np.arange(12).reshape(3, 4)
print(np.split(arr, 3, axis=0))   # 拆成3个数组(按行)
print(np.hsplit(arr, 2))          # 水平拆成2个# 添加/删除
arr = np.array([1, 2, 3])
print(np.append(arr, [4, 5]))
print(np.insert(arr, 1, [10, 20]))
print(np.delete(arr, [0, 2]))# 去重与集合
arr = np.array([1, 2, 2, 3, 3, 3, 4])
print(np.unique(arr))                        # [1 2 3 4]
print(np.intersect1d([1,2,3], [2,3,4]))      # [2 3]
print(np.setdiff1d([1,2,3], [2,3,4]))        # [1]

阶段七:文件读写

import numpy as nparr1 = np.arange(10)
arr2 = np.random.rand(3, 4)# .npy 保存/加载
np.save('arr1.npy', arr1)
loaded = np.load('arr1.npy')# .npz 保存/加载多个数组
np.savez('arrays.npz', a=arr1, b=arr2)
data = np.load('arrays.npz')
print(data['a'])
print(data['b'])# 压缩保存
np.savez_compressed('arrays_compressed.npz', a=arr1, b=arr2)# 文本文件
np.savetxt('data.txt', arr2, delimiter=',', fmt='%.2f')
loaded_txt = np.loadtxt('data.txt', delimiter=',')# 处理缺失值的文本读取
# data.csv: 1,2,,4
# loaded = np.genfromtxt('data.csv', delimiter=',', filling_values=0)

阶段八:实用技巧

import numpy as nparr = np.array([-2, -1, 0, 1, 2, 3])# np.where 条件选择
result = np.where(arr > 0, arr, 0)
print(result)  # [0 0 0 1 2 3]# np.clip 裁剪
print(np.clip(arr, -1, 2))  # [-1 -1  0  1  2  2]# 排序
arr = np.array([3, 1, 4, 1, 5, 9, 2])
print(np.sort(arr))
print(np.argsort(arr))  # 排序后的索引# view vs copy
a = np.array([1, 2, 3])
v = a.view()   # 视图,共享内存
c = a.copy()   # 副本,独立内存
a[0] = 100
print(v)  # [100 2 3]
print(c)  # [1 2 3]# 避免循环,向量化
# 慢
result = []
for x in range(1000000):result.append(x * 2 + 1)# 快
x = np.arange(1000000)
result = x * 2 + 1

第二部分:NumPy 高频面试题

1. NumPy 数组和 Python 列表有什么区别?

  • NumPy 数组元素类型统一,内存连续,支持向量化运算,速度更快,占用内存更小。
  • Python 列表元素可以是不同类型,元素分散存储,操作需要循环迭代。

2. 什么是广播(Broadcasting)?规则是什么?

广播是 NumPy 在形状不同的数组间进行算术运算的机制。

规则:

  1. 从后往前比较形状
  2. 两个维度相等,或其中一个为1
  3. 不满足则报错

示例:(3, 4) + (4,)(3, 4) + (1, 4)(3, 4)

3. reshape(-1, 1) 中的 -1 是什么意思?

自动计算该维度的大小,使元素总数不变。reshape(-1, 1) 表示转成列向量。

4. ravel()flatten() 的区别?

  • flatten() 永远返回副本
  • ravel() 尽可能返回视图(view),修改会影响原数组

5. 如何高效创建一个大数组?

np.zeros((1000, 1000))   # 比 np.empty 后赋值更快(某些情况)
np.arange(1000000)       # 比循环 append 快百倍

6. 如何计算两个数组的欧氏距离?

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dist = np.sqrt(np.sum((a - b) ** 2))
# 或
dist = np.linalg.norm(a - b)

7. 如何在不循环的情况下统计数组中某元素出现次数?

arr = np.array([1, 2, 2, 3, 3, 3])
count = np.sum(arr == 3)  # 3

8. np.where 的用法有哪些?

  • 单参数:np.where(arr > 0) 返回满足条件的索引
  • 三参数:np.where(condition, x, y) 条件为True取x,否则取y

9. 如何处理 NaN 值?

arr = np.array([1, np.nan, 3, np.nan])
arr[np.isnan(arr)] = 0     # 填充为0
mean_val = np.nanmean(arr) # 忽略NaN求均值

10. 如何实现矩阵的按列归一化?

arr = np.array([[1, 2, 3], [4, 5, 6]])
normalized = arr / np.sum(arr, axis=0)  # 广播除法

第三部分:循序渐进的练习计划

第1-2天:基础创build与操作

任务:

  1. 用5种不同方式创建一个 4×5 的全1矩阵
  2. 创建一个从0到100、步长为0.5的数组
  3. 创建一个3×3的随机整数矩阵(范围1-100),计算每一行、每一列的最大值和最小值
  4. 将一个8×8的棋盘格模式数组创建出来(0和1交替)

第3-4天:索引与筛选

任务:

  1. 创建一个10×10的随机数组,找出所有大于0.5的元素并设置为1,其余为0
  2. 从一个一维数组中筛选出所有能被3整除的数
  3. 给定一个学生成绩矩阵(5人×6科),找出每个学生的最高分科目索引,以及每个科目的不及格人数(<60)
  4. 用花式索引提取数组的第1、3、5、7行

第5-6天:运算与广播

任务:

  1. 不用循环,计算一个数组的Z-score标准化:(x - mean) / std
  2. 用一个3×1的列向量和一个1×4的行向量,利用广播生成3×4的乘法表
  3. 实现一个简单的Min-Max归一化函数
  4. 计算两个100×100随机矩阵的点积,并与双重循环方式对比时间

第7-8天:线性代数实战

任务:

  1. 用NumPy求解一个3元一次方程组(自己设计系数矩阵和常量)
  2. 手动实现一个PCA降维的核心步骤(协方差矩阵→特征值分解→取前k个特征向量→投影)
  3. 判断一个3×3矩阵是否可逆(行列式≠0),若可逆则求逆
  4. 实现最小二乘法的解析解:θ = (X^T X)^{-1} X^T y

第9-10天:综合项目

任务:

  1. 图像翻转与旋转:读取一张灰度图的像素矩阵(或用随机矩阵代替),实现水平翻转、垂直翻转、90度旋转
  2. 股价分析:生成100天的随机股价数据(正态分布+趋势),计算5日、10日移动平均,找出金叉和死叉位置
  3. KNN分类器:用NumPy实现一个简单的KNN分类器(不调用sklearn),包含距离计算、排序、投票

每日检查清单


需要我把这些内容导出为 Markdown 文件,或者进一步讲解其中某个部分吗?

http://www.jsqmd.com/news/766259/

相关文章:

  • AI多智能体系统实现3D虚拟城市自动生成
  • FPGA新手必看:手把手教你用Verilog实现UDP数据包封装(附完整代码结构)
  • 全球化运营新挑战:数据治理如何破局
  • 对比不同大模型通过Taotoken生成视频脚本的风格与token效率差异
  • 校招C++20并发系列07-保障线程公平性:Ticket Spinlock手写与吞吐权衡
  • 即梦去除水印教程:即梦怎么去掉水印?2026 实测方法全整理 - 科技热点发布
  • 魔兽争霸III终极优化指南:WarcraftHelper让经典游戏在现代电脑上重生
  • VSCode 2026金融安全配置:7个必须禁用的默认设置,否则触发监管穿透式审计告警
  • 黑群晖7.x ame半洗白加激活补丁
  • 瞬态热阻(Zth)与稳态热阻(Rth)详解 + C# 算法区别
  • 告别PS!用HandyView做图像对比实验,效率提升不止一点点(附Windows/Mac安装包)
  • 用户如何挑选靠谱的国内专业厌氧培养箱生产商?2026年实测方案 - 速递信息
  • FunASR热词功能实测:如何用Paraformer模型提升会议记录中专业术语的识别准确率?
  • 即梦去水印免费方法有哪些?即梦如何免费去掉水印?2026实测可用方案汇总 - 科技热点发布
  • 新手避坑指南:用STM32F4做FOC电机驱动,PCB布局这8个细节千万别忽略
  • gte-base-zh建材行业:混凝土配比描述→强度/耐久性数据语义关联
  • 从Twitter到YouTube:我是如何用《System Design Interview》里的框架,通过国内大厂系统设计轮的
  • [t.9.6] Scrum Meeting 6
  • C#开发的书店进销存管理系统(含完整源码与数据库)
  • 别只用来生成大头照了!解锁 GPT Image 2 的最新设计实战玩法
  • 曾仕强讲《易经》贲卦:一个人越缺什么,就越爱秀什么
  • 压缩技术重新定义存储价值:探路者全栈方案打开存储新空间
  • 告别静态地图:用GLC_FCS30D和GEE制作动态土地覆被变化视频(附完整代码)
  • 即梦去水印小程序怎么用?即梦AI有没有官方去水印工具?2026实测方法全盘点 - 科技热点发布
  • 告别NeRF的漫长等待:手把手教你用3D Gaussian Splatting实现实时新视角合成
  • IP Interrupt Status Register (Read/TOW)中断状态寄存器说明
  • 别再为公网IP发愁了!学会PAT,一个地址撑起整个内网
  • 第三章综合实验
  • 面向对象基础认识3
  • 【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)【采用BPSK或GMSK的Turbo码】MSK、GMS