数据分析与处理—Numpy

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循环

1.Numpy ndarray:多维数组对象

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)

2.ndarray的数据类型

数据类型dtype,是一个特殊的对象,包含了ndarray需要为某一种类型数据所申明的内存块信息(也成为元数据,即表示数据的数据)。

dtype是Numpy能够与其他系统数据灵活交互的原因。数据的dtype通常是按照一个方式命名:类型名,比如float和int,后面接上表示每个元素位数的数字。

可以使用astype方法显式的转换数组的数据类型,使用astype总能生成一个新的数组,即使传入的dtype与以前的一样。

3.基础索引与切片

如果传入一个数组给数组切片给,例如arr[5:8],数值被传递给整个切片,区别于Python的内建函数,数组的切片是原数组的视图。这意味着数据并不是被复制,任何对于视图的修改都会反映到原数组上

对二维数组进行切片:

eg:arr[:2]即选择arr的前两行

arr[1,:2]表示选择第二行但是只选择前两列

arr[:2,2]表示选择第三列,但是只选择前两行。

arr[:,:1]单独一个冒号表示选择整个数轴上的数组。

arr[:2,1:]=0可以对切片表达式赋值,整个切片都会重新赋值

4.数组转置和换轴

转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。数组拥有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返回的是数据的视图,而没有对数据进行复制。

5.通用函数:快速的逐元素数组函数

通用函数,可称为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  -  进行逐个元素的逻辑操作(与逻辑操作符&,|,^效果等价)

6.使用数组进行面向对象编程

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的最小二乘解

7.伪随机数生成

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]分布中抽取样本

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值