数据处理-numpy

1.Numpy ndarray:多维数组对象 2.ndarray的数据类型 3.基础索引与切片 4.数组转置和换轴 5.通用函数:快速的逐元素数组函数 6.使用数组进行面向对象编程 7.伪随机数生成。。Numpy ndarray:多维数组对象 Numpy的核心特征之一就是N-维数组对象-ndarray。ndarray时Python中一个快速、灵活的大型数据集容器。数组允许使用类型于标量的操作语法在整个数据上进行数学计算。对于更高维度的数组,transpose方法可以接收包含轴编号的元组,用于置换轴: ```python import numpy as np arr=np...

预计阅读时间:12 分钟

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.数组转置和换轴

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


本文由 suisui 发布