python numpy包的使用

文章目录

非常强的一个包,在数组、矩阵、向量计算方面极具优势。

比较常用的功能

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)
相关推荐
小邓睡不饱耶2 小时前
Python多线程爬虫实战:爬取论坛帖子及评论
开发语言·爬虫·python
毕设源码-邱学长2 小时前
【开题答辩全过程】以 基于 java web 的篮球赛事管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
喵手2 小时前
Python爬虫实战:手把手教你如何采集开源字体仓库目录页(Google Fonts / 其他公开字体目录)!
爬虫·python·自动化·数据采集·爬虫实战·零基础python爬虫教学·开源字体仓库目录页采集
zhangren024682 小时前
PHP vs C++:从Web脚本到系统编程的终极对比
开发语言·c++·php
聆风吟º2 小时前
【C标准库】深入理解 C 语言memmove函数:安全内存拷贝的利器
c语言·开发语言·memmove·库函数
临溟夜空的繁星2 小时前
C++STL—— list
开发语言·c++·list
Chase_______2 小时前
【Python 基础】第2章:流程控制完全指南(if/match/while/for)
python
第一程序员2 小时前
Python高级特性详解:从基础到进阶
python·github
lsx2024062 小时前
Ruby JSON处理指南
开发语言