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 )
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.Tnp.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()检查是否为NaN np.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 )
print ( "NumPy数组:" )
print ( data)
df = pd. DataFrame( data, columns= [ '特征1' , '特征2' , '特征3' ] )
print ( "\nDataFrame:" )
print ( df)
df. to_csv( 'data.csv' , index= False )
print ( "数据已保存到data.csv" )
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)
df_combined = pd. DataFrame( combined, columns= [ '年龄' , '薪资' , '经验' ] )
print ( "\n合并DataFrame:" )
print ( df_combined)
df_combined. to_csv( 'combined_data.csv' , index= False )
print ( "合并数据已保存到combined_data.csv" )
处理带标签的数据
data = np. random. randn( 4 , 3 )
row_labels = [ '样本1' , '样本2' , '样本3' , '样本4' ]
column_labels = [ '重量' , '长度' , '宽度' ]
df_labeled = pd. DataFrame( data, index= row_labels, columns= column_labels)
print ( "带标签的DataFrame:" )
print ( df_labeled)
df_labeled. to_csv( 'labeled_data.csv' )
print ( "带标签数据已保存到labeled_data.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 )
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) )
feature_names = [ '温度' , '压力' , '湿度' , '速度' ]
df = pd. DataFrame( data, columns= feature_names + [ '产量' ] )
print ( "数据摘要:" )
print ( df. describe( ) )
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 ) )
cur_list = [ 'CNY' , 'CNH' , 'HKD' ]
ratings = np. tile( np. tile( rating_list, len ( cur_list) ) , 1000 )
currencies = np. tile( np. repeat( cur_list, len ( rating_list) ) , 1000 )
df = pd. DataFrame( {
'rating_1' : ratings,
'rating_2' : ratings,
'cur' : currencies
} )
print ( df. shape)
print ( df. head( 21 ) )
NumPy 优质学习资源
官方文档与教程
NumPy 官方文档 - 最权威的参考资料,包含所有函数的详细说明NumPy 用户指南 - 官方提供的入门教程和高级用法NumPy 教程 - SciPy - SciPy提供的NumPy教程
在线课程
DataCamp: Introduction to NumPy - 交互式学习NumPy基础Coursera: Python for Data Science - 包含NumPy模块的完整数据科学课程edX: Python for Data Science - 多家大学提供的数据科学课程
视频教程
FreeCodeCamp: NumPy Full Course - 免费的完整NumPy课程Corey Schafer: NumPy Tutorial - 高质量的NumPy入门教程Sentdex: NumPy Programming - 机器学习视角的NumPy教程
书籍
《Python for Data Analysis》by Wes McKinney - 包含NumPy和Pandas的权威指南《Elegant SciPy》by Juan Nunez-Iglesias等 - 科学计算的最佳实践《Guide to NumPy》by Travis Oliphant - NumPy创建者编写的权威指南
练习平台
HackerRank NumPy Challenges - 练习NumPy编程技能LeetCode NumPy Problems - 算法题中的NumPy应用Exercism NumPy Track - 提供NumPy相关练习
社区与论坛
Stack Overflow NumPy Tag - 解决具体问题的好地方NumPy Discourse - NumPy官方讨论区Reddit r/learnpython - Python学习社区,常有NumPy相关问题
中文资源
NumPy 中文文档 - NumPy官方文档的中文翻译莫烦Python NumPy教程 - 中文视频教程菜鸟教程 NumPy - 中文入门教程