赞
踩
Numpy是目前Python数值计算中最为重要的基础包。大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通用语。
在数据分析过程中,要关注:
1.在数据处理、清洗、构造子集、过滤、变换以及其他计算中进行快速的向量化计算
2.常见的数组算法,比如sort、unique和set操作等
3.高效的描述性统计和聚合/概述数据
4.数据排列和相关数据操作,例如对异构数据进行merge和join
5.使用数组表达式来表明条件逻辑,替代if-elif-else条件分支的循环
6.分组数据的操作(聚合、变换以及函数式操作)
Numpy在内部将数据存储在连续的内存块上,这与其他的Python内建数据结构是不同的。Numpy的算法库是用C语言写的,所以在操作数据内存时,不需要任何类型检查或者其他管理操作。Numpy数组使用的内存量也小于其他Python内建序列
Numpy可以针对全量数组进行复杂计算而不需要写Python循环
Numpy的核心特征之一就是N-维数组对象-ndarray。ndarray时Python中一个快速、灵活的大型数据集容器。数组允许使用类型于标量的操作语法在整个数据上进行数学计算。
一个ndarray是一个通用的多维同类数据容器,它包含的每一个元素均为相同类型。每一个数组都是shape属性,用来表征数组每一维度的数量,每一个数组都有一个dtype属性,用来描述数组的数据类型。
生成数组最简单的方式就是使用array函数。array函数接收任意的序列型对象,生成一个新的包含传递数据的Numpy数组。
- import numpy as np
-
- data1=[6,7.5,8,0,1]
- arr1=np.array(data1)
- data2=[[1,2,3,4],[5,6,7,8]]
- arr2=np.array(data2)
除了np.array,华友很多其他函数可以创建新数组。例如给定长度和形状后,zeros可以一次性创建全0数组,ones可以一次性创造全1数组。empty则可以创建一个没有初始化数值的数组。想要创建高维数组,则需要一个shape船体一个元组。但当使用np.empty创建一个全0的数组并不安全,有时候可能会返回未初始化的垃圾数值。
arange是Python内建函数range的数组版
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
下面是一些标准数组的生成函数。由于Numpy是专注于数值计算,如果没有特别指明,默认数据类型为float64.
array - 将输入数据转换为ndarray,如不显式指明数据类型,将自动推断;默认复制所有的输入数据
asarray - 将输入转换为ndarray,但如果输入已经是ndarray则不再复制
arange - Python内建函数range的数组版,返回一个数组
ones - 根据给行形状和数据类型生成全1数组
ones_like - 根据给定的数组生成一个形状一样的全1数组
zeros - 根据给定形状和数据类型生成全-数组
zeros_like - 根据所给的数组生成一个形状一样的全0数组
empty - 根据给定形状生成一个没有初始化数值的空数组
empty_like - 根据所给的数组生成一个形状一样的空数组
full - 根据所给定的形状盛恒只当数值的数组
full_like - 根据所给的数组生成一个形状一样但内容是指定数值的数组
eye,identity - 生成一个NXN特征矩阵(对角线位置都是1,其余位置都是0)
数据类型dtype,是一个特殊的对象,包含了ndarray需要为某一种类型数据所申明的内存块信息(也成为元数据,即表示数据的数据)。
dtype是Numpy能够与其他系统数据灵活交互的原因。数据的dtype通常是按照一个方式命名:类型名,比如float和int,后面接上表示每个元素位数的数字。
可以使用astype方法显式的转换数组的数据类型,使用astype总能生成一个新的数组,即使传入的dtype与以前的一样。
如果传入一个数组给数组切片给,例如arr[5:8],数值被传递给整个切片,区别于Python的内建函数,数组的切片是原数组的视图。这意味着数据并不是被复制,任何对于视图的修改都会反映到原数组上
对二维数组进行切片:
eg:arr[:2]即选择arr的前两行
arr[1,:2]表示选择第二行但是只选择前两列
arr[:2,2]表示选择第三列,但是只选择前两行。
arr[:,:1]单独一个冒号表示选择整个数轴上的数组。
arr[:2,1:]=0可以对切片表达式赋值,整个切片都会重新赋值
转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。数组拥有transpose方法,也有特殊的T属性
- import numpy as np
-
- arr=np.arange(15).reshape((3,5))
arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
当进行矩阵计算时,可能进行一些特定的操作:计算矩阵的内积会使用np.dot。对于更高维度的数组,transpose方法可以接收包含轴编号的元组,用于置换轴:
- import numpy as np
-
- arr=np.arange(16).reshape((2,2,4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.transpose((1,0,2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
在这里,轴已经被重新排序,使得原理啊的第二个轴变为第一个,原理啊的第一个轴变为第二个,最后一个轴没有变化。
ndarray可以使用swapaxes方法接收一堆轴编号作为参数,并对轴进行调整用于重组数据。
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.swapaxes(1,2)
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
swapaxes返回的是数据的视图,而没有对数据进行复制。
通用函数,可称为ufunc,是一种再ndarray数据中进行逐元素操作的函数。某些简单函数接受一个或读个标量数值,并产生一个或多个标量结果,而通用函数就是对这些简单的函数的向量化封装。
一元通用函数:
abs、fabs - 逐元素地计算整数、浮点数或者复数的绝对值
sqrt - 计算每个元素的平方根
square - 计算每个元素的平方
exp - 计算每个元素的自然指数值
log、log10、log2、log1p - 分别对应:自然对数(以e为底),对数10为底、对数2为底,log(1+x)
sign - 计算每个元素的符号值:1(正数),0,-1(复数)
ceil - 计算每个元素的最高整数值(即大于等于给定数值的最小整数)
floor - 计算每个㢝的最小整数值(即小于等于给定元素的最大整数)
rint - 将元素保留到整数位,并保持dtype
modf - 分别将数组的小数部分和整数部分按照数组形式返回
isnan - 返回数组中的元素是否四一个NaN(不是一个数值),形式为布尔值数组
isfinite,isinf - 分别返回数组中的元素是否有限(非inf,非NaN),是否无限,形式为布尔值数组
cos、cosh、sin - 常规的双曲三角函数
sinh、tan、tanh
arccos、arccosh、arcsin - 反三角函数
logical_not - 对数组的元素按位取反(与~arr效果一致)
二元通用函数
add - 将数组的对应元素相加
subtract - 在第二个数组中,将第一个数组中包含的元素去除
multiply - 将数组的对应元素相乘
divide、floor_divide - 除或整除
power - 将第二个数组的元素组为第一个数组对应元素的幂次方
maxium,fmax - 逐个葛元素计算最大值,fmax忽略NaN
minium、fmin - 逐个元素计算最小值,fmin忽略NaN
mod - 暗元素的求模计算(即求除法的余数)
greater、greater_equal,less ,less_euqal,eqial,not_equal - 进行逐个元素的比较,返回布尔值数组(与数学操作符>,>=,<,<=,==,!=效果一致)
logical_and,logical_or,logical_xor - 进行逐个元素的逻辑操作(与逻辑操作符&,|,^效果等价)
numpy.where函数是三元表达式x if condition else y 的向量化版本。
- import numpy as np
-
- x=np.array([1.1,1.2,1.3,1.4,1.5])
- y=np.array([2.1,2.2,2.3,2.4,2.5])
- c=np.array([True,False,True,True,False])
- reslut=[(x if c else y) for x,y,c in zip(x,y,c)]
使用numpy.where可以简单的完成:
result=np.where(c,x,y)
np.where的第二个和第三个参数并不需要是数组,可以是标量。where在数据分析中的一个典型用法是根据一个数据来生成一个新的数组。假设有一个随机生成的矩阵数据,并且想将其中的正数替换为2,所有的负数替换为-2,使用np.where会很容易实现。
一些基础数组统计方法
sum - 沿着轴向计算所有元素的累和,0长度的数组,累和为0
mean - 数学平均,0长度的数组平均值为NaN
std,var - 标准差和方差,可以选择自由度调整
min,max - 最小值和最大值
argmin,argmax - 最小值和最大值的位置
cumsum - 从0开始元素累积和
cumprod - 从1开始元素累积积
np.sort()返回的是已经排序好的数组拷贝,而不是原数组按位排序。
np.unique()返回的是数组中位移值排序后形成的数组
np.in1d()可以检查一个数组中的值是否在另外一个数组中,返回一个布尔数组
数组的集合操作
unique(x) - 计算x的唯一值,并排序
intersect1d(x,y) - 计算x和y的交集,并排序
union1d(x,y) - 计算x和y的并集,并排序
in1d(x,y) - 计算x中的元素是否包含在y中,返回一个布尔值数组
setdiffer1d(x,y) - 差集,在x中但不在y中的x的元素
setxor1d(x,y) - 异或集,在x或y中,但不属于x,y交集的元素
线性代数函数列表
diag - 将一个方针的对角(或非对角)元素作为一维数组返回,或者将一维数组转换为一个方阵,并在非对角线上有零点
dot - 矩阵点乘
trace - 计算对角元素的和
det - 计算矩阵的行列式
eig - 计算方阵的特征值和特征向量
inv - 计算方阵的逆矩阵
pinv - 计算矩阵的Moore-Penrose伪逆
qr - 计算QR分解
svd - 计算奇异值分解(SVD)
solve - 求解x的线性系统Ax=b,其中A为方阵
lstsq - 计算Ax=b的最小二乘解
numpy.random模块填补了Python内建的random模块的不足,可以高效的生成多种概率分布下的完整样本值数组。
samples=np.random.normal(size=(4,4))获得一个4x4的正态分布样本数组
numpy.random中的数据生成函数共用了一个全局的随机数种子。为避免全局状态,可以使用numpy.random.RandomState生成一个随机数生成器,使数据独立于其他的随机数状态。
numpy.random中的部分函数列表
seed - 向随机数生成器传递随机状态种子
permutat - 返回一个序列的随机排列,或者返回一个乱序的整数范围序列
shuffle - 随机排列一个序列
rand - 从均匀分布中抽取样本
randint - 根据给定的由低到高的范围抽取随机整数
randn - 从均值0方差1的正态分布中抽取样本
binomial - 从二项分布中抽取样本
normal - 从正态分布中抽取样本
beta - 从beta分布中抽取样本
chisquare - 从卡方分布中抽取样本
gamma - 从伽马分布中抽取样本
uniform - 从均匀[0,1]分布中抽取样本
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。