文章目录
非常强的一个包,在数组、矩阵、向量计算方面极具优势。
比较常用的功能
np.array() # 创建向量数据
np.dot() # 计算点积
np.linalg # 线性代数,linalg不是最终的方法,它下面有很多具体的方法
python
np.linalg.norm() # 计算模长
np.mean() # 求平均数
linalg()看起怪怪的,这很正常,它的英文是linear algebra(线性代数),看做lin+alg就好理解了。
计算相似度
代码:
python
import numpy as np
# 1. 创建向量 (模拟 AI 生成的 Embedding)
# 实际中这些向量可能有 1536 维,这里为了演示用 5 维
vec_a = np.array([0.9, 0.8, 0.1, 0.2, 0.5]) # 语义:喜欢、吃、水果
vec_b = np.array([0.85, 0.9, 0.2, 0.1, 0.6]) # 语义:喜欢、吃、水果 (很相似)
vec_c = np.array([0.1, 0.2, 0.9, 0.8, 0.1]) # 语义:天气、时间、好 (不相似)
# 2. 计算余弦相似度
# 公式:(A · B) / (||A|| * ||B||)
# 结果越接近 1,表示越相似
def cosine_similarity(v1, v2):
# np.dot 计算点积
dot_product = np.dot(v1, v2)
# np.linalg.norm 计算范数(模长)
norm_v1 = np.linalg.norm(v1)
norm_v2 = np.linalg.norm(v2)
return dot_product / (norm_v1 * norm_v2)
# 3. 执行计算
score_ab = cosine_similarity(vec_a, vec_b)
score_ac = cosine_similarity(vec_a, vec_c)
print(f"向量 A 和 B 的相似度: {score_ab:.4f}") # 结果应该接近 1
print(f"向量 A 和 C 的相似度: {score_ac:.4f}") # 结果应该接近 0 或更低
输出结果:
bash
向量 A 和 B 的相似度: 0.9898
向量 A 和 C 的相似度: 0.3383
计算矩阵
代码:
python
import numpy as np
# 1. 创建一个 3x3 的矩阵 (比如 3 个学生的 3 门课成绩)
scores = np.array([
[80, 90, 85], # 学生 A: 语文, 数学, 英语
[70, 85, 90], # 学生 B
[95, 95, 90] # 学生 C
])
print("--- 原始数据 ---")
print(scores)
# 2. 批量计算:给所有成绩加 5 分 (向量化操作,不需要写循环)
new_scores = scores + 5
print("\n--- 加分后 ---")
print(new_scores)
# 3. 统计分析:计算每门课的平均分 (按列计算,axis=0)
# axis=0 表示"竖着切",即计算每一列
avg_scores = np.mean(scores, axis=0)
print("\n--- 每门课平均分 ---")
print(f"语文: {avg_scores[0]}, 数学: {avg_scores[1]}, 英语: {avg_scores[2]}")
# 4. 筛选数据:找出所有大于 90 分的成绩
high_scores = scores[scores > 90]
print("\n--- 大于 90 分的成绩 ---")
print(high_scores)
输出结果:
python
--- 原始数据 ---
[[80 90 85]
[70 85 90]
[95 95 90]]
--- 加分后 ---
[[ 85 95 90]
[ 75 90 95]
[100 100 95]]
--- 每门课平均分 ---
语文: 81.66666666666667, 数学: 90.0, 英语: 88.33333333333333
--- 大于 90 分的成绩 ---
[95 95]
有人问 求平均数还不简单,还用的着mean()方法吗?
看清了,这可不是数组求和/个数,这可是矩阵。
自己写需要写一堆for循环,乱七八槽,效率还低。
mean()方法一行代码搞定,清爽+高效。
np.sum()方法
计算矩阵的行和与列和
python
import numpy as np
# 创建一个 3x3 的矩阵
matrix = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
# 1. 计算所有元素的总和
total_sum = np.sum(matrix)
print("总和:", total_sum) # 输出: 45
# 2. 计算每一列的和 (沿着行方向,即 axis=0)
col_sum = np.sum(matrix, axis=0)
print("每列的和:", col_sum) # 输出: [12 15 18]
# 3. 计算每一行的和 (沿着列方向,即 axis=1)
row_sum = np.sum(matrix, axis=1)
print("每行的和:", row_sum) # 输出: [ 6 15 24]
keepdims求和后保持结果的维度不变示例
代码:
python
import numpy as np
# 创建一个 3x4 的矩阵
arr = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
print("原始形状:", arr.shape) # (3, 4)
sum_normal = np.sum(arr, axis=1)
print("普通求和结果:", sum_normal) # [10 26 42]
print("普通求和形状:", sum_normal.shape) # (3,) <-- 注意:变成了1维
sum_keep = np.sum(arr, axis=1, keepdims=True)
print("保持维度结果:", sum_keep)
# [[10]
# [26]
# [42]]
print("保持维度形状:", sum_keep.shape) # (3, 1) <-- 注意:还是2维矩阵
输出结果:
python
原始形状: (3, 4)
------------------
普通求和结果: [10 26 42]
普通求和形状: (3,)
-------------------
保持维度结果: [[10]
[26]
[42]]
保持维度形状: (3, 1)
可以看到,加了keepdims=true之后,还保持了二维数组的结构,在计算时不易出错。
np.sum()的内置参数
| 参数 | 功能说明 | 示例 |
|---|---|---|
axis |
指定沿哪个轴(维度)进行求和。 | np.sum(matrix, axis=0) |
keepdims |
求和后保持结果的维度不变,方便后续的广播运算。 | np.sum(matrix, axis=1, keepdims=True) |
where |
根据布尔条件进行选择性求和。 | np.sum(arr, where=arr > 0) (只对正数求和) |
dtype |
指定求和结果的数据类型,可防止整数溢出。 | np.sum(arr, dtype=np.float64) |
initial |
设置求和的初始值。 | np.sum([1, 2], initial=10) (结果为13) |