


















好的,以下为你整理的全部内容:代码示例 + 高频面试题 + 循序渐进的练习计划。
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 在形状不同的数组间进行算术运算的机制。
规则:
示例:(3, 4) + (4,) → (3, 4) + (1, 4) → (3, 4)
reshape(-1, 1) 中的 -1 是什么意思?自动计算该维度的大小,使元素总数不变。reshape(-1, 1) 表示转成列向量。
ravel() 和 flatten() 的区别?flatten() 永远返回副本ravel() 尽可能返回视图(view),修改会影响原数组np.zeros((1000, 1000)) # 比 np.empty 后赋值更快(某些情况)
np.arange(1000000) # 比循环 append 快百倍
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)
arr = np.array([1, 2, 2, 3, 3, 3])
count = np.sum(arr == 3) # 3
np.where 的用法有哪些?np.where(arr > 0) 返回满足条件的索引np.where(condition, x, y) 条件为True取x,否则取yarr = np.array([1, np.nan, 3, np.nan])
arr[np.isnan(arr)] = 0 # 填充为0
mean_val = np.nanmean(arr) # 忽略NaN求均值
arr = np.array([[1, 2, 3], [4, 5, 6]])
normalized = arr / np.sum(arr, axis=0) # 广播除法
任务:
任务:
任务:
(x - mean) / std任务:
θ = (X^T X)^{-1} X^T y任务:
%timeit 测试性能(Jupyter环境)需要我把这些内容导出为 Markdown 文件,或者进一步讲解其中某个部分吗?
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。