惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
N
Netflix TechBlog - Medium
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
B
Blog
MyScale Blog
MyScale Blog
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
S
Schneier on Security
Project Zero
Project Zero
T
Tenable Blog
T
Tor Project blog
U
Unit 42
G
GRAHAM CLULEY
N
News and Events Feed by Topic
P
Proofpoint News Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
C
Cybersecurity and Infrastructure Security Agency CISA
腾讯CDC
博客园 - 叶小钗
M
MIT News - Artificial intelligence
Vercel News
Vercel News
T
Threat Research - Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
I
Intezer
博客园 - 聂微东
SecWiki News
SecWiki News
Scott Helme
Scott Helme
C
Cyber Attacks, Cyber Crime and Cyber Security
IT之家
IT之家
量子位
S
Secure Thoughts
The Cloudflare Blog
博客园 - 司徒正美
Know Your Adversary
Know Your Adversary
Hacker News: Ask HN
Hacker News: Ask HN
V
Vulnerabilities – Threatpost
Simon Willison's Weblog
Simon Willison's Weblog
N
News | PayPal Newsroom
C
Check Point Blog
Spread Privacy
Spread Privacy
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cyberwarzone
Cyberwarzone

博客园 - ace--碳水化合物

韦达定理 韦达定理1 梯形1 总平均分 m1 曲线相关 曲线 不等式 抛硬币 错位排列"(全错位)问题 11 1 两圆阴影面积 English1 Tidio 官方帮助中心 ERP 相关系统介绍 蝉翼定理 选配法 利润最大化公式 写在失业的一段话 排列组合-组合 在线简历 概率论与数理统计学习章节 绝对值 比例五大定理 算术平均值与几何平均值 等价符号 公因数与最大公因数 容斥原理 英语2026 机器学习,深度学习,强化学习 分别是什么以及区别是什么 深度学习 监督学习 FAQ IVR TTS选择 k 近邻算法 kaldi 平稳核函数(stationary kernel) Karush-Kuhn-Tucker 条件 凸二次规划(convex quadratic programming) FunASR+FreeSwitch做坐席客服系统记录 freeswitch原理图 客服系统,第三方平台,对话转录音,这些可以不依赖第三方做么 STUN服务器 Gun.js原理 游戏升级记 10 OBB 边界问题 关于yolo26是否可以通过结合java开发 opencv和yolo是一回事情吗 pytorch TorchVision - ace--碳水化合物 PyTorch 和 FashionMNIST 的关系 java record 游戏升级记 9 VibeVoice实现90分钟、多角色播客生成,拓展语音合成新边界 同 WiFi 下用 Claude Code 控制另一台 Windows 电脑 游戏升级记 8 开源claudecode前端 github star 9k+ 向量数据库skill 游戏升级记 7 游戏升级记 6 关系型数据库,向量数据库,ES,缓存,列式数据库,时序数据库,图数据库等的区别和共同点列举table 多Agent可视化 Agent设计模式 中文 Hermes+Obsidian+LLM wkii,构建AI知识库 Claude Code 前端工程泄露代码开源 游戏升级记 5 ai记忆 Rag 1 游戏升级记 4 游戏升级记 3 游戏升级记 2 AI学习路线 关于hermes agent安装 1 游戏升级记 1 代码迷踪 十三 代码迷踪 十二 ai智能体工程 Rust vs Go 微信小程序实名认证 怎样制作一个街机游戏 跟Claude code说 深入思考 它会思考更深入. googlebusiness profile设置统一白名单的操作,要弹窗模式的 该怎样利用ollama自己训练一个编程大模型 中华AI智能体编程一站式基站构想 打包网站到exe和app 识别的内容一般是试题模板的题号和手写的答题答案(数字) opencv怎么训练 在线SaaS系统做接口版本滚动更新 stripe相关支付流程 流程示意图 error: linker `link.exe` not found | = note: program not found - rust 给我一份关于stripe平台的使用开发说明 c++学习记20260219 奥数-平面几何经典定理 奥数-组合数学 奥数-几何 奥数-代数 奥数-数论
Numpy 1
ace--碳水化合物 · 2026-05-06 · via 博客园 - 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 np

arr = 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 np

a = 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 np

A = 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 np

a = 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 np

arr1 = 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 np

arr = 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),包含距离计算、排序、投票

每日检查清单

  • 所有操作尽量使用向量化,避免 for 循环
  • 关注 axis 参数的使用(0=行方向/垂直, 1=列方向/水平)
  • 注意 view 和 copy 的区别,避免意外修改原数组
  • 代码写完后,用 %timeit 测试性能(Jupyter环境)

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