AI和数据科学的基石-Numpy与Pandas

欢迎来到啾啾的博客。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论。

目录

  • 引言
  • 1 Numpy
    • 1.1 Numpy数组 vs. Python列表
    • 1.2 为什么Numpy能这么快?
    • 1.3 与LLM
    • 1.4 “向量化”操作
  • 2 Pandas
    • 2.1 Pandas核心数据结构-DataFrame

引言

一文快速了解Numpy与Pandas。从理论到代码。

1 Numpy

我们学习LLM时听到的“向量(Vector)”,在Python代码中的标准载体,就是Numpy数组。

1.1 Numpy数组 vs. Python列表

假设我们有一个包含一百万个读数的列表,需要将每个读数都乘以2。

  • 使用纯Python列表
# 生成一百万个数字
python_list = list(range(1_000_000)) 

# 我们必须写一个循环来处理
new_list = []
for item in python_list:
    new_list.append(item * 2)

这能工作,但当数据量巨大时,Python解释器逐个处理元素会非常慢。

  • 使用Numpy数组:
import numpy as np # "np" 是使用Numpy的标准别名

# 生成一百万个数字
python_list = list(range(1_000_000)) 

# 将Python列表转换为Numpy数组
numpy_array = np.array(python_list)

# 直接操作数组,不使用循环。Numpy会自动将这个操作应用到数组的每一个元素上。
new_array = numpy_array * 2

这个特性叫做 “向量化” (Vectorization)

1.2 为什么Numpy能这么快?

    1. 同质性 (Homogeneous)
      一个Numpy数组里的所有元素都必须是 相同的数据类型(比如全是整数,或全是浮点数)。这与Python列表可以容纳任何类型的元素([1, “hello”, True])形成鲜明对比。因为类型统一,Numpy可以在底层使用优化过的C语言或Fortran代码来执行计算,绕过了Python的动态类型检查开销。
    1. 内存布局 (Memory Layout)
      Numpy数组在内存中是连续存储的,这使得计算机处理器能够极快地访问和处理数据。

连续内存应该是核心中的核心,CPU加载缓存行,连续内存读取更快。

1.3 与LLM

Numpy和LLM有什么关系呢?

当我们将文本“你好世界”转换成 词向量 (Embedding) 时,我们得到的不是一个字符串,而是一个由数字组成的 向量,例如 [0.12, -0.45, 0.89, …]。这个向量可能有几百甚至上千个维度(数字)。

当我们要比较两个句子(比如“天气真好”和“今天阳光明媚”)的相似度时,我们实际上是在计算它们各自对应的向量之间的“距离”或“夹角余弦”。这涉及到大量的、重复的数学运算。

如果用Python列表来存储和计算这数百万个向量,整个应用会慢到无法使用。而Numpy,正是为这种大规模向量运算而生的。

1.4 “向量化”操作

在向量空间中,判断两个向量(比如两个句子的Embedding)是否相似,最基本的方法之一是计算它们的 点积 (Dot Product)
点积的计算规则很简单:将两个向量对应位置的元素相乘,然后将所有乘积相加。
例如,向量 A = [1, 2, 3] 和向量 B = [4, 5, 6]
它们的点积是:(1*4) + (2*5) + (3*6) = 4 + 10 + 18 = 32

点积的值越大,通常表示两个向量在方向上越接近,也就是越“相似”。

python代码如下:

import numpy as np

# 假设这是“天气真好”的向量
vector_a = np.array([0.1, 0.5, 0.9])

# 假设这是“今天阳光明媚”的向量
vector_b = np.array([0.2, 0.6, 0.8])

# 点积一般做法(方便理解所以写上)
(vector_a*vector_b).sum()

# 还可以使用np的dot函数
np.dot(vector_a, vector_b)

# 更好的做法是:使用专用的矩阵乘法运算符
vector_a @ vector_b

使用 np.dot() 或者 @ 运算符,是用来表达这个数学概念的最清晰、可读性最强、效率最高的方式。当另一位开发者看到 vector_a @ vector_b 这行代码时,他会立刻明白你的意图是计算点积。

2 Pandas

Pandas是建立在Numpy之上的,但它的使命不同。Numpy关心的是对 单个数组 进行高效的数学运算,而Pandas关心的是对 整个结构化数据集 (可以想象成一张Excel表格或数据库表)进行高效的筛选、转换、清洗和分析。

在LLM应用开发中,我们需要处理的不仅仅是向量,还有与向量关联的 元数据 (Metadata)。比如,这个向量对应的是哪段文本?文本来源是哪个文件?创建时间是什么时候?Pandas就是管理这一切的最佳工具。

2.1 Pandas核心数据结构-DataFrame

Pandas最核心的数据结构叫做 DataFrame。可以把它想象成一个功能极其强大的Excel电子表格,它有行(我们称为 索引 Index)和列(Columns)。

让我们用“可用模型列表”的例子,看看Pandas如何让它变得更好用。

# 原始数据
available_models_list = [
    {"name": "gpt-4-turbo", "context_window": 128000, "is_multimodal": True},
    {"name": "claude-3-opus", "context_window": 200000, "is_multimodal": True},
    {"name": "gemini-1.5-pro", "context_window": 1000000, "is_multimodal": True},
    {"name": "text-embedding-ada-002", "context_window": 8191, "is_multimodal": False}
]

这种结构不直观,操作起来很麻烦。

  • 转换成DataFrame
import pandas as pd # "pd" 是使用Pandas的标准别名

available_models_list = [
    {"name": "gpt-4-turbo", "context_window": 128000, "is_multimodal": True},
    {"name": "claude-3-opus", "context_window": 200000, "is_multimodal": True},
    {"name": "gemini-1.5-pro", "context_window": 1000000, "is_multimodal": True},
    {"name": "text-embedding-ada-002", "context_window": 8191, "is_multimodal": False}
]

# 只需一行代码,就能创建DataFrame
df = pd.DataFrame(available_models_list)

# 当你打印或显示df时,会看到一个漂亮的表格:
#
#                      name  context_window  is_multimodal
# 0             gpt-4-turbo          128000           True
# 1           claude-3-opus          200000           True
# 2          gemini-1.5-pro         1000000           True
# 3  text-embedding-ada-002            8191          False

"""
数据立刻变得清晰、结构化了。左边的 `0, 1, 2, 3` 就是索引,
顶部的 `name, context_window, is_multimodal` 就是列。
DataFrame的超能力:
轻松选取一整列:想看所有的模型名称?
可以直接用 `df['name']` 选取 `name` 列。
"""
print(df['name'])
print("\n")
# 如果想对列数据进行筛选,如选择那些'is_multimodal'列的值为True的行
multimodal_models = df[df['is_multimodal'] == True]
print(multimodal_models)
print("\n")

# 快速统计分析:想知道最大上下文窗口是多少?
max_context = df['context_window'].max()
print(max_context) # 输出: 1000000

DataFrame这种数据操作方式,是在准备RAG知识库、分析模型输出、筛选训练样本时,每天都要用到的核心技能。

我们继续使用上面创建的 df 这个DataFrame。
只用一行Pandas代码,筛选出并显示所有 context_window 大于 150,000 的模型

windows = df[df['context_window'] > 150000]

你可能感兴趣的:(#,Python基础,人工智能,numpy,pandas,python)