Numpy学习
一、数组基本属性
- ndim:维度
- shape:行数和列数
- size:元素个数
二、numpy创建数组
a = np.array([2,23,4]) # list 1d
- array:创建数组
- dtype:指定数据类型
- 使用list来创建
- zeros:创建数据全为0
- ones:创建数据全为1
- empty:创建数据接近0
- arrange:按指定范围创建数据
- linspace:创建线段
- reshape:改变数组形状
三、广播
- 如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制。
- 广播规则
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐
- 输出数组的形状是输入数组形状的各个维度上的最大值
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
- 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。
四、数组操作
函数 |
描述 |
reshape |
不改变数据的条件下修改形状 |
flat |
数组元素迭代器 |
flatten |
返回一份数组拷贝,对拷贝所做的修改不会影响原始数组。(order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序) |
ravel |
返回展开数组,修改会影响原始数组。(order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序) |
函数 |
描述 |
transpose |
对换数组的维度 |
ndarray.T |
和self.transpose()相同,数组的转置 |
rollaxis |
向后滚动指定的轴 |
swapaxes |
对换数组的两个轴 |
函数 |
描述 |
broadcast |
产生模仿广播的对象 |
broadcast_to |
将数组广播到新形状 |
expand_dims |
扩展数组的形状 |
squeeze |
从数组的形状中删除一维条目 |
函数 |
描述 |
concatenate |
连接沿现有轴的数组序列 |
stack |
沿着新的轴加入一系列数组 |
hstack |
水平堆叠序列中的数组(列方向) |
vstack |
竖直堆叠序列中的数组(行方向) |
函数 |
描述 |
split |
将一个数组分割为多个子数组 |
hsplit |
将一个数组水平分割为多个子数组(按列) |
vsplit |
将一个数组垂直分割为多个子数组(按行) |
函数 |
描述 |
resize |
返回指定形状的新数组 |
append |
将值添加到数组末尾 |
insert |
沿指定轴将值插入到指定下标之前 |
delete |
删掉某个轴的子数组,并返回删除后的新数组 |
unique |
查找数组内的唯一元素 |
五、位运算
函数 |
描述 |
bitwise_and |
对数组元素执行位与操作 |
bitwise_or |
对数组元素执行位或操作 |
invert |
按位取反 |
left_shift |
向左移动二进制表示的位 |
right_shift |
向右移动二进制表示的位 |
六、字符串函数
- 下面这些函数都在字符数组类(numpy.char)中定义
函数 |
描述 |
add() |
对两个数组的逐个字符串元素进行连接 |
multiply() |
返回按元素多重连接后的字符串 |
center() |
居中字符串 |
capitalize() |
将字符串第一个字母转换为大写 |
title() |
将字符串的每个单词的第一个字母转换为大写 |
lower() |
数组元素转换为小写 |
upper() |
数组元素转换为大写 |
split() |
指定分隔符对字符串进行分割,并返回数组列表 |
splitlines() |
返回元素中的行列表,以换行符分割 |
strip() |
移除元素开头或者结尾处的特定字符 |
join() |
通过指定分隔符来连接数组中的元素 |
replace() |
使用新字符串替换字符串中的所有子字符串 |
decode() |
数组元素依次调用str.decode |
encode() |
数组元素依次调用str.encode |
七、数学函数
- 三角函数:sin()、cos()、tan()、arcsin()、arccos()和 arctan()。
- 舍入函数:numpy.around() 函数返回指定数字的四舍五入值;numpy.floor() 返回数字的下舍整数;numpy.ceil() 返回数字的上入整数。
八、算术运算
- 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide()。
- numpy.reciprocal() :函数返回参数逐元素的倒数。
- numpy.power():函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。
- numpy.mod() 计算输入数组中相应元素的相除后的余数。 函数 numpy.remainder() 也产生相同的结果。
九、统计函数
函数 |
描述 |
numpy.amin() |
用于计算数组中的元素沿指定轴的最小值, 如果提供了轴,则沿其计算。 |
numpy.amax() |
用于计算数组中的元素沿指定轴的最大值, 如果提供了轴,则沿其计算。 |
numpy.ptp() |
数计算数组中元素最大值与最小值的差(最大值 - 最小值), 如果提供了轴,则沿其计算。 |
numpy.percentile() |
百分位数是统计中使用的度量,表示小于这个值的观察值的百分比, 如果提供了轴,则沿其计算。 |
numpy.median() |
函数用于计算数组 a 中元素的中位数(中值), 如果提供了轴,则沿其计算。 |
numpy.mean() |
函数返回数组中元素的算术平均值, 如果提供了轴,则沿其计算。 |
numpy.average() |
函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。该函数可以接受一个轴参数。 如果没有指定轴,则数组会被展开 |
十、排序、条件刷选函数
函数 |
描述 |
numpy.sort() |
函数返回输入数组的排序副本 |
numpy.argsort() |
函数返回的是数组值从小到大的索引值 |
numpy.lexsort() |
用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列 |
msort(a) |
数组按第一个轴排序,返回排序后的数组副本。np.msort(a) 相等于 np.sort(a, axis=0) |
sort_complex(a) |
对复数按照先实部后虚部的顺序进行排序 |
partition(a, kth[, axis, kind, order]) |
指定一个数,对数组进行分区 |
argpartition(a, kth[, axis, kind, order]) |
可以通过关键字 kind 指定算法沿着指定轴对数组进行分区 |
numpy.argmax() |
函数分别沿给定轴返回最大元素的索引 |
numpy.argmin() |
函数分别沿给定轴返回最小元素的索引 |
numpy.nonzero() |
函数返回输入数组中非零元素的索引 |
numpy.where() |
函数返回输入数组中满足给定条件的元素的索引 |
numpy.extract() |
函数根据某个条件从数组中抽取元素,返回满条件的元素 |
十一、副本与视图
- 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。
- 副本一般发生在:
1、Python 序列的切片操作,调用deepCopy()函数。
2、调用 ndarray 的 copy() 函数产生一个副本。
- 视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
- 视图一般发生在:
1、numpy 的切片操作返回原数据的视图。
2、调用 ndarray 的 view() 函数产生一个视图。
十二、矩阵库(Matrix)
- NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。
|创建矩阵的方法|描述|
|----|----|
|matlib.empty()|函数返回一个新的矩阵|
|numpy.matlib.zeros()|函数创建一个以 0 填充的矩阵|
|numpy.matlib.ones()|函数创建一个以 1 填充的矩阵|
|numpy.matlib.eye()|函数返回一个矩阵,对角线元素为 1,其他位置为零|
|numpy.matlib.identity()|函数返回给定大小的单位矩阵|
|numpy.matlib.rand()|函数创建一个给定大小的矩阵,数据是随机填充的|
十三、线性代数
- NumPy 提供了线性代数函数库 linalg,该库包含了线性代数所需的所有功能
函数 |
说明 |
dot |
两个数组的点积,即元素对应相乘 |
vdot |
两个向量的点积 |
inner |
两个数组的内积 |
matmul |
两个数组的矩阵积 |
determinant |
数组的行列式 |
solve |
求解线性矩阵方程 |
inv |
计算矩阵的乘法逆矩阵 |
十四、数据保存和读取
- Numpy 可以读写磁盘上的文本数据或二进制数据。
- NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。
- npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。
- 常用的 IO 函数有:
- load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下, 数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
- savze() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。
- loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)。
函数 |
描述 |
numpy.save() |
函数将数组保存到以 .npy 为扩展名的文件中,使用numpy.load()来获取数据 |
numpy.savez() |
函数将多个数组保存到以 npz 为扩展名的文件中,使用numpy.load()来获取数据 |
savetxt() |
函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据 |
Pandas学习
一、基本介绍
- 如果用 python 的列表和字典来作比较, 那么可以说 Numpy 是列表形式的,没有数值标签,而 Pandas 就是字典形式。Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。
- Series数据结构:索引在左边,值在右边。如果我们没有为数据指定索引。于是会自动创建一个0到N-1(N为长度)的整数型索引。
- DataFrame数据结构:是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。
#创建Srries数据结构
import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,44,1])
#创建DataFrame数据结构
#方法一
dates = pd.date_range('20160101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
#方法二
df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
#方法三:
df2 = pd.DataFrame({'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
'D' : np.array([3] * 4,dtype='int32'),
'E' : pd.Categorical(["test","train","test","train"]),
'F' : 'foo'})
#DataFrame数据结构的简单运用
print(df2.dtypes) #查看数据中的类型
print(df2.index) #查看对列的序号
print(df2.columns) #查看对列的列名
print(df2.values) #只查看所有df2的值
df2.describe() #查看数据的总结
print(df2.T) #翻转数据, transpose
print(df2.sort_index(axis=1, ascending=False)) #对数据的 index 进行排序并输出
print(df2.sort_values(by='B')) #对数据值排序输出
二、选择数据
- 选择列或行
- 根据标签 loc选择,即根据行的名字和烈的名字进行选择
- 根据序列 iloc选择,即行所在的行数和列所在的列数进行选择
- 根据ix选择,即loc和iloc混合进行选择
- 通过判断的筛选
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
print(df['A']) #按列选择
print(df.A) #按列选择
print(df[0:3]) #切片选择
print(df['20130102':'20130104']) #切片选择
print(df.loc['20130102']) #使用标签来选择数据 ,即选择某一行
print(df.loc[:,['A','B']]) #使用切片
print(df.iloc[3,1]) #采用位置进行选择
print(df.iloc[3:5,1:3]) #使用切片
print(df.ix[:3,['A','C']]) #混合选择
print(df[df.A>8]) #采用判断指令 (Boolean indexing) 进行选择
三、设置值
- 根据位置设置 loc 和 iloc设置值
- 根据条件设置
- 按行或列设置
- 添加数据
import pandas as pd
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
df.iloc[2,2] = 1111
df.loc['20130101','B'] = 2222
df.B[df.A>4] = 0
df['F'] = np.nan
df['E'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130101',periods=6))
四、处理丢失数据
函数 |
描述 |
dropna() |
直接去掉有 NaN 的行或列 |
fillna() |
将 NaN 的值用其他值代替 |
isnull() |
判断是否有缺失数据 NaN, 为 True 表示缺失数据 |
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
df.dropna(
axis=0, # 0: 对行进行操作; 1: 对列进行操作
how='any' # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop
)
df.fillna(value=0)
print(df.isnull())
print(np.any(df.isnull())) == True #表格是否包含NaN值
五、导入和导出
- pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等…,详细请看官网说明
六、合并处理
(1)concat合并
- pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式.而且concat中有很多参数可以调整,合并成你想要的数据形式.
- 参数介绍
- axis:合并方向,默认值为
0
。
- ignore_index:重置
index
。
- join:合并方式,默认值为
outer
,此方式是依照column来做纵向合并,有相同的column上下合并在一起,其他独自的column个自成列,原本没有值的位置皆以NaN填充,如果设置为inner
,只有相同的column合并在一起,其他的会被抛弃。
- join_axes:依照 axes 合并。
- append:添加数据。
(2)merge合并
- pandas中的merge和concat类似,但主要是用于两组有key column的数据,统一索引的数据. 通常也被用在Database的处理当中。
- merge参数
- 合并时有4种方法
how = ['left', 'right', 'outer', 'inner']
,默认值how='inner'
。
-
indicator=true
:会将合并的记录放在新的一列。
- 依据index合并:left_index、left_index
- 使用suffixes解决名子重复(overlapping)的问题
import pandas as pd
#一组key的情况
#定义资料集并打印出
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on='key')
import pandas as pd
#两组key的情况
#定义资料集并打印出
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
res = pd.merge(left, right, on=['key1', 'key2'], how='outer')
res = pd.merge(left, right, on=['key1', 'key2'], how='left')
res = pd.merge(left, right, on=['key1', 'key2'], how='right')
#定义资料集
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})
#使用suffixes解决overlapping的问题
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
七、plot绘图
-
绘图方法
- plot.bar
- plot.hist
- plot.box
- plot.kde
- plot.area
- plot.scatter
- plot.hexbin
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt #仅仅是用来 show 图片的
# 随机生成1000个数据
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
# 为了方便观看效果, 我们累加这个数据
data.cumsum()
# pandas 数据可以直接观看其可视化形式
data.plot()
plt.show()
data = pd.DataFrame(
np.random.randn(1000,4),
index=np.arange(1000),
columns=list("ABCD")
)
data.cumsum()
data.plot()
plt.show()
ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')
# 将之下这个 data 画在上一个 ax 上面
data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)
plt.show()