Python NumPy 入门指南

NumPy 入门指南:高效数据处理与CSV导出

NumPy是Python科学计算的基础库,提供了高性能的多维数组对象和工具。主要优势:

  • 性能远超Python列表
  • 丰富的数组操作和数学函数
  • 与Pandas无缝集成
  • 方便的数据导出和共享

本指南将介绍NumPy的基础知识。

1. NumPy 基础

安装NumPy

pip install numpy

导入NumPy

import numpy as np
import pandas as pd

2. NumPy数组 vs Python列表

2.1 创建数组

函数名描述示例
np.array()从列表或元组创建数组np.array([1, 2, 3])
np.arange()创建等差序列数组np.arange(0, 10, 2)[0, 2, 4, 6, 8]
np.linspace()创建指定数量的等间隔数组np.linspace(0, 1, 5)[0, 0.25, 0.5, 0.75, 1]
np.zeros()创建全零数组np.zeros((2, 3)) → 2x3零矩阵
np.ones()创建全一数组np.ones((3, 2)) → 3x2一矩阵
np.empty()创建未初始化数组np.empty((2, 2))
np.eye()创建单位矩阵np.eye(3) → 3x3单位矩阵
np.full()创建填充指定值的数组np.full((2, 2), 7) → 2x2填充7的矩阵
np.random.rand()创建均匀分布随机数组np.random.rand(3, 3)
np.random.randn()创建标准正态分布随机数组np.random.randn(100)
np.random.randint()创建随机整数数组np.random.randint(0, 10, (3, 3))
np.diag()创建对角矩阵np.diag([1, 2, 3])
# 从列表创建数组
python_list = [1, 2, 3, 4, 5]
numpy_array = np.array(python_list)
print("NumPy数组:", numpy_array)
print("类型:", type(numpy_array))

# 创建特殊数组
zeros = np.zeros(5)  # 全零数组
ones = np.ones(5)    # 全一数组
range_array = np.arange(10)  # 类似range的数组
random_array = np.random.rand(5)  # 随机数组

2.2 多维数组

# 创建二维数组
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("二维数组:")
print(matrix)

# 数组属性
print("形状:", matrix.shape)
print("维度:", matrix.ndim)
print("元素总数:", matrix.size)
print("数据类型:", matrix.dtype)

3. 数组操作

函数名描述示例
np.reshape()改变数组形状而不改变数据arr.reshape(2, 3)
np.resize()改变数组形状并调整大小np.resize(arr, (3, 3))
np.flatten()将数组展平为一维arr.flatten()
np.ravel()返回展平的数组(视图)arr.ravel()
np.transpose()转置数组arr.transpose()arr.T
np.swapaxes()交换两个轴arr.swapaxes(0, 1)
np.concatenate()沿指定轴连接数组np.concatenate((a, b), axis=0)
np.vstack()垂直堆叠数组np.vstack((a, b))
np.hstack()水平堆叠数组np.hstack((a, b))
np.split()将数组分割为多个子数组np.split(arr, 3)
np.hsplit()水平分割数组np.hsplit(arr, 2)
np.vsplit()垂直分割数组np.vsplit(arr, 2)
np.tile()重复数组np.tile(arr, (2, 3))
np.repeat()重复数组元素np.repeat(arr, 3, axis=0)
np.roll()循环移动数组元素np.roll(arr, 2)
np.sort()返回排序后的数组np.sort(arr)
np.argsort()返回排序索引np.argsort(arr)
np.unique()返回数组中的唯一元素np.unique(arr)

索引和切片

# 一维数组索引
arr = np.array([10, 20, 30, 40, 50])
print("第一个元素:", arr[0])
print("最后一个元素:", arr[-1])
print("切片:", arr[1:4])

# 二维数组索引
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("第一行:", matrix[0])
print("第二行第二列:", matrix[1, 1])
print("第一列:", matrix[:, 0])

形状操作

arr = np.arange(12)
print("原始数组:", arr)

# 重塑形状
reshaped = arr.reshape(3, 4)
print("重塑为3x4:")
print(reshaped)

# 展平
flattened = reshaped.flatten()
print("展平数组:", flattened)

数组运算

函数名描述示例
np.add()元素级加法np.add(a, b)
np.subtract()元素级减法np.subtract(a, b)
np.multiply()元素级乘法np.multiply(a, b)
np.divide()元素级除法np.divide(a, b)
np.power()元素级幂运算np.power(a, 2)
np.sqrt()元素级平方根np.sqrt(arr)
np.exp()元素级指数函数np.exp(arr)
np.log()元素级自然对数np.log(arr)
np.log10()元素级以10为底对数np.log10(arr)
np.sin()元素级正弦函数np.sin(arr)
np.cos()元素级余弦函数np.cos(arr)
np.tan()元素级正切函数np.tan(arr)
np.sum()数组元素求和np.sum(arr)np.sum(arr, axis=0)
np.mean()计算算术平均值np.mean(arr)
np.std()计算标准差np.std(arr)
np.var()计算方差np.var(arr)
np.min()找出最小值np.min(arr)
np.max()找出最大值np.max(arr)
np.argmin()找出最小值的索引np.argmin(arr)
np.argmax()找出最大值的索引np.argmax(arr)
np.cumsum()计算累积和np.cumsum(arr)
np.cumprod()计算累积积np.cumprod(arr)
np.dot()点积/矩阵乘法np.dot(a, b)
np.cross()叉积np.cross(a, b)
np.inner()内积np.inner(a, b)
np.outer()外积np.outer(a, b)
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 基本运算
print("加法:", a + b)
print("乘法:", a * b)
print("平方:", a ** 2)

# 数学函数
print("正弦:", np.sin(a))
print("对数:", np.log(a))
print("平方根:", np.sqrt(a))

逻辑运算函数

函数名描述示例
np.greater()元素级大于比较np.greater(a, b)
np.less()元素级小于比较np.less(a, b)
np.equal()元素级等于比较np.equal(a, b)
np.not_equal()元素级不等于比较np.not_equal(a, b)
np.greater_equal()元素级大于等于比较np.greater_equal(a, b)
np.less_equal()元素级小于等于比较np.less_equal(a, b)
np.logical_and()元素级逻辑与np.logical_and(a, b)
np.logical_or()元素级逻辑或np.logical_or(a, b)
np.logical_not()元素级逻辑非np.logical_not(a)
np.logical_xor()元素级逻辑异或np.logical_xor(a, b)
np.where()条件选择np.where(condition, x, y)
np.select()多条件选择np.select(condlist, choicelist)
np.clip()限制数组值范围np.clip(arr, min, max)
np.isnan()检查是否为NaNnp.isnan(arr)
np.isinf()检查是否为无穷大np.isinf(arr)
np.isfinite()检查是否为有限数np.isfinite(arr)

统计函数

函数名描述示例
np.percentile()计算百分位数np.percentile(arr, 50)
np.median()计算中位数np.median(arr)
np.corrcoef()计算相关系数np.corrcoef(x, y)
np.cov()计算协方差矩阵np.cov(x, y)
np.histogram()计算直方图np.histogram(arr, bins=10)
np.bincount()计算非负整数数组中每个值的出现次数np.bincount(arr)
np.diff()计算离散差分np.diff(arr)

线性代数函数

函数名描述示例
np.linalg.inv()计算矩阵的逆np.linalg.inv(a)
np.linalg.det()计算矩阵行列式np.linalg.det(a)
np.linalg.eig()计算特征值和特征向量np.linalg.eig(a)
np.linalg.svd()奇异值分解np.linalg.svd(a)
np.linalg.qr()QR分解np.linalg.qr(a)
np.linalg.cholesky()Cholesky分解np.linalg.cholesky(a)
np.linalg.norm()计算范数np.linalg.norm(a)
np.linalg.cond()计算条件数np.linalg.cond(a)
np.linalg.solve()解线性方程组np.linalg.solve(a, b)
np.linalg.lstsq()最小二乘解np.linalg.lstsq(a, b)

文件输入输出函数

函数名描述示例
np.save()将数组保存到二进制文件np.save('array.npy', arr)
np.load()从二进制文件加载数组arr = np.load('array.npy')
np.savez()将多个数组保存到压缩文件np.savez('arrays.npz', a=a, b=b)
np.savetxt()将数组保存到文本文件np.savetxt('array.txt', arr)
np.loadtxt()从文本文件加载数组arr = np.loadtxt('array.txt')
np.genfromtxt()从文本文件加载数据,处理缺失值arr = np.genfromtxt('data.csv', delimiter=',')

4. NumPy数组转DataFrame再转CSV

单个数组转换

# 创建示例数组
data = np.random.rand(5, 3)  # 5行3列的随机数组
print("NumPy数组:")
print(data)

# 转换为DataFrame
df = pd.DataFrame(data, columns=['特征1', '特征2', '特征3'])
print("\nDataFrame:")
print(df)

# 导出为CSV
df.to_csv('data.csv', index=False)
print("数据已保存到data.csv")

# 从CSV读取回DataFrame
df_read = pd.read_csv('data.csv')
print("\n从CSV读取的数据:")
print(df_read)

多个数组合并转换

# 创建多个相关数组
ages = np.array([25, 30, 35, 40, 45])
salaries = np.array([50000, 60000, 70000, 80000, 90000])
experiences = np.array([2, 5, 10, 15, 20])

# 合并为二维数组
combined = np.column_stack((ages, salaries, experiences))
print("合并后的数组:")
print(combined)

# 转换为DataFrame
df_combined = pd.DataFrame(combined, columns=['年龄', '薪资', '经验'])
print("\n合并DataFrame:")
print(df_combined)

# 导出为CSV
df_combined.to_csv('combined_data.csv', index=False)
print("合并数据已保存到combined_data.csv")

处理带标签的数据

# 创建带行标签的数据
data = np.random.randn(4, 3)  # 4行3列的正态分布随机数
row_labels = ['样本1', '样本2', '样本3', '样本4']
column_labels = ['重量', '长度', '宽度']

# 转换为DataFrame
df_labeled = pd.DataFrame(data, index=row_labels, columns=column_labels)
print("带标签的DataFrame:")
print(df_labeled)

# 导出为CSV
df_labeled.to_csv('labeled_data.csv')
print("带标签数据已保存到labeled_data.csv")

# 读取带索引的CSV
df_labeled_read = pd.read_csv('labeled_data.csv', index_col=0)
print("\n读取的带标签数据:")
print(df_labeled_read)

5. 实际应用示例

数据预处理和保存

# 生成示例数据
np.random.seed(42)  # 确保可重复性
n_samples = 100

# 创建特征矩阵
X = np.random.rand(n_samples, 4)  # 100个样本,4个特征
X[:, 0] = X[:, 0] * 10 + 20  # 调整第一个特征范围

# 创建目标变量
y = 2 * X[:, 0] + 3 * X[:, 1] - 1.5 * X[:, 2] + np.random.randn(n_samples) * 0.5

# 合并特征和目标
data = np.column_stack((X, y))

# 转换为DataFrame
feature_names = ['温度', '压力', '湿度', '速度']
df = pd.DataFrame(data, columns=feature_names + ['产量'])

print("数据摘要:")
print(df.describe())

# 导出为CSV
df.to_csv('processed_data.csv', index=False)
print("处理后的数据已保存到processed_data.csv")

# 可选:添加日期索引
dates = pd.date_range('20230101', periods=n_samples)
df_dated = df.copy()
df_dated['日期'] = dates
df_dated.set_index('日期', inplace=True)

# 导出带日期索引的数据
df_dated.to_csv('dated_data.csv')
print("带日期的数据已保存到dated_data.csv")

数据预处理和保存

给定:两个列表(rating(1-5)和cur(3种货币))

目标:生成一个DataFrame,其中每一对(rating,cur)组合为一行的两列。这样的组合有7*3=21行。然后将这21行重复1000次,得到21000行。

import pandas as pd
import numpy as np

# 定义两个列表
rating_list = list(range(1, 6))  # 数值1-5
cur_list = ['CNY', 'CNH', 'HKD']  # 三种货币

# 使用numpy的repeat和tile函数高效创建数据
ratings = np.tile(np.tile(rating_list, len(cur_list)), 1000)
currencies = np.tile(np.repeat(cur_list, len(rating_list)), 1000)

# 创建DataFrame
df = pd.DataFrame({
    'rating_1': ratings,
    'rating_2': ratings,
    'cur': currencies
})

print(df.shape)  # 应该输出 (21000, 2)
print(df.head(21))  # 查看前21行数据

NumPy 优质学习资源

官方文档与教程

  1. NumPy 官方文档 - 最权威的参考资料,包含所有函数的详细说明
  2. NumPy 用户指南 - 官方提供的入门教程和高级用法
  3. NumPy 教程 - SciPy - SciPy提供的NumPy教程

在线课程

  1. DataCamp: Introduction to NumPy - 交互式学习NumPy基础
  2. Coursera: Python for Data Science - 包含NumPy模块的完整数据科学课程
  3. edX: Python for Data Science - 多家大学提供的数据科学课程

视频教程

  1. FreeCodeCamp: NumPy Full Course - 免费的完整NumPy课程
  2. Corey Schafer: NumPy Tutorial - 高质量的NumPy入门教程
  3. Sentdex: NumPy Programming - 机器学习视角的NumPy教程

书籍

  1. 《Python for Data Analysis》by Wes McKinney - 包含NumPy和Pandas的权威指南
  2. 《Elegant SciPy》by Juan Nunez-Iglesias等 - 科学计算的最佳实践
  3. 《Guide to NumPy》by Travis Oliphant - NumPy创建者编写的权威指南

练习平台

  1. HackerRank NumPy Challenges - 练习NumPy编程技能
  2. LeetCode NumPy Problems - 算法题中的NumPy应用
  3. Exercism NumPy Track - 提供NumPy相关练习

社区与论坛

  1. Stack Overflow NumPy Tag - 解决具体问题的好地方
  2. NumPy Discourse - NumPy官方讨论区
  3. Reddit r/learnpython - Python学习社区,常有NumPy相关问题

中文资源

  1. NumPy 中文文档 - NumPy官方文档的中文翻译
  2. 莫烦Python NumPy教程 - 中文视频教程
  3. 菜鸟教程 NumPy - 中文入门教程
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值