python数据分析(EDA)三剑客(1)之numpy


本文介绍的是数据分析中的“ 大哥”:Numpy

0.Ndarray对象

NumPy(Numeric Python)是一个开源的Python科学计算基础库,用于处理多维数组运算:官网

  • 一个强大的N维数组对象: ndarray
  • 广播功能函数,在数组之间进行计算
  • 线性代数、傅里叶变换、随机数生成等功能
  • NumPy是SciPy,Pandas等数据处理或科学计算库的基础

NumPy库中最基础数据类型是由同种元素构成的ndarray,它的维度叫做轴(axis),轴的个数叫做秩(rank)
ndarray是一个多维数组的对象,由两部分构成:

  • 实际的数据
  • 描述这些数据的元数据(数据维度,数据类型等)
属性说明
.dim秩,即轴的数量或维度的数量
.shapendarray对象的尺寸
.sizendarray对象元素的个数
.dtypendarray对象的元素类型
.itemsizendarray对象每个元素的大小

Python 本身支持的数值类型有 int(整型)、float(浮点型)、bool(布尔型) 和 complex(复数型)。而 NumPy 支持比 Python 本身更为丰富的数值类型。numpy 的数值类型实际上是 dtype 对象的实例。常用的数据类型有:

数据类型说明
bool布尔类型
int8字节(-128 to 127)
int16整数(- 2 15 2^{15} 215 to 2 15 − 1 2^{15}-1 2151
int32整数(- 2 31 2^{31} 231 to 2 31 − 1 2^{31}-1 2311
int64整数(- 2 63 2^{63} 263 to 2 63 − 1 2^{63}-1 2631
float16半精度浮点数
float32单精度浮点数
float64双精度浮点数
complex64复数,表示双 32 位浮点数
complex128复数,表示双 64 位浮点数

1.数组的创建

import numpy as np # 习惯引用语句

(1) 依据现有数据创建(列表、元组)

在 NumPy 中,我们使用 np.array 函数将列表或元组转换为 ndarray 数组。其方法为:

# object:列表、元组等。
# dtype:数据类型。如果未给出,则类型为被保存对象所需的最小类型。
np.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

一般只用到前两个参数,x = np.array(<list>/<tuple>, dtype = np.float32)

np.array([[1, 2, 3], [4, 5, 6]],dtype=np.int64)
np.array([(1, 2), (3, 4), (5, 6)])

(2) 使用函数创建(arange,ones,zeros等)

函数描述举例
np.arange(start,stop,step,dtype=None)类似range()函数,创建一个由start到stop,以step为步长的数组np.arange(1,10,2)
np.zeros(shape,dtype=None)根据shape生成一个全0数组,shape是元组类型np.zeros((2,5))
np.ones(shape,dtype=None)根据shape生成一个全1数组,shape是元组类型np.ones((2,5))
np.full(shape,val)根据shape生成一个数组,每个元素值是valnp.full((2,4),3)
np.eye(n)创建nxn的单位矩阵,对角线为1,其余为0np.eye(5)

(3) 从已知数据文件、函数中创建

2.数组的索引与切片

(1)整数索引

一维数组索引与切片,与列表相似(python列表索引:click here
直接以二维数组为例:通过对每个以逗号分隔的维度执行单独的切片,可以对多维数组进行切片。对于二维数组,第一片定义了行的切片,第二片定义了列的切片。

import numpy as np
# 创建一个5x5的二维数组
x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
操作结果
x[0:2][ [11 12 13 14 15]
[16 17 18 19 20] ]
x[1:5:2][ [16 17 18 19 20]
[26 27 28 29 30] ]
x[2:][ [21 22 23 24 25]
[26 27 28 29 30]
[31 32 33 34 35] ]
x[:-2][ [11 12 13 14 15]
[16 17 18 19 20]
[21 22 23 24 25] ]
x[2 , : ][21 22 23 24 25]
x[ : , -2 ][13 18 23 28 33]
x[ 1:4 , 0 ][16 21 26]
x[ 1:3 , 2:4][[18 19]
[23 24]]
x[ : : 2 , : : 2][ [11 13 15]
[21 23 25]
[31 33 35] ]

(2) 省略号索引

通过省略号来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray

import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
操作描述结果
a[… , 1]取第二列的元素[2 4 5]
a[1 , …]取第二行的元素[3 4 5]
a[… , 1 : ]第二列及剩下的所有元素[ [2 3]
[4 5]
[5 6] ]
a[… , : :-1]按照列的维度翻转[ [3 2 1]
[5 4 3]
[6 5 4] ]

(3)整数数组索引:

方括号内传入多个索引值,可以同时选择多个元素
一维数组:

import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) #创建一个一维数组
print(x[0,1,2])  # [1,2,3]

二维数组:

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])

print(x[0,1,-1])  #选择行的索引是0,1,-1(也就是5)

row = [0, 1, 2]
col = [2, 3, 4]
y = x[row, col]  #选择行的索引为0,1,2,列的索引为2,3,4
print(y) # [13 19 25]

[ [11 12 13 14 15]
[16 17 18 19 20]
[31 32 33 34 35] ]

[13 19 25]

(4)整数数组与切片结合

import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])

y = x[0:3, [1, 2]] #选择行的索引为0-3,列的索引为1和2
print(y)

[ [12 13 ]
[17 18 ]
[22 23 ] ]

3.数组的操作

(1)修改数组形状

函数描述
np.reshape(a,newshape)重设形状,不改变原数据
np.flatten(order=‘C’)将数组的副本转换为一维数组,并返回。
np.ravel(a, order=‘C’)任意形状的数组扁平化,变为 1 维数组
import numpy as np
a = np.arange(6)
print("原数组是:",a)
b = a.reshape(3,2) # reshape改变数组尺寸
print("修改后的数组:","\n",b)
print (b.flatten())  # 使用flatten函数展开,[0 1 2 3 4 5]
print (b.ravel())   # 使用ravel函数展开,[0 1 2 3 4 5]

原数组是: [0 1 2 3 4 5]
修改后的数组:
[ [0 1]
[2 3]
[4 5] ]
[0 1 2 3 4 5]
[0 1 2 3 4 5]

注:a.reshape(newshape)或reshape(a,newshape)都可以完成reshape功能

(2)翻转数组

函数描述
np.transpose()转置
np.swapaxes(a, axis1, axis2)交换轴
np.moveaxis(a, source, destination)轴移动
import numpy as np
arr = np.arange(6).reshape(1,2,3)
print ('原数组:','\n',arr) # 原数组是一个1x2x3的三维数组

arr_tp = np.transpose(arr)
print ('对换数组:','\n',arr_tp) # 经过交换转置后是3x2x1

arr_swap = np.swapaxes(arr, 0, 2)
print('交换轴之后:','\n',arr_swap) # 0和2轴交换,3x2x1

arr_move = np.moveaxis(arr, 0, -1)
print('移动轴之后:','\n',arr_move) # 0轴移到-1轴,2x3x1

原数组: # 1x2x3
[ [ [0 1 2]
[3 4 5] ] ]

对换数组:
[ [ [0]
[3]]
[[1]
[4]]
[[2]
[5] ] ]

交换轴之后:
[ [ [0]
[3]]
[[1]
[4]]
[[2]
[5] ] ]

移动轴之后:
[ [ [0]
[1]
[2]]
[[3]
[4]
[5] ] ]

more about transpose:

import numpy as np
arr = np.arange(6).reshape(1,2,3)
print ('原数组:','\n',arr) # 原数组是一个1x2x3的三维数组
# 原数组的轴依次是0,1,2;现在要换轴2,1,0;则尺寸就是3x1x2
arr1 = arr.transpose(2,0,1)
print ('换轴之后:','\n',arr1)
"""
也可以用下面这种写法
arr2=np.transpose(arr,(2,0,1))
print(arr2)
"""

原数组:
[ [ [0 1 2]
[3 4 5] ] ]
换轴之后:
[ [ [0 3] ]
[ [1 4] ]
[ [2 5] ] ]

(3)连接数组

函数描述
np.concatenate((a1, a2, …), axis=0)将多个数组沿指定轴连接在一起
np.stack(arrays,axis)沿着新轴连接数组的序列
np.hstack()水平堆叠来生成数组
np.vstack()垂直堆叠来生成数组
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
 
# 两个数组的维度相同
print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b)))
print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))

沿轴 0 连接两个数组:
[[1 2]
[3 4]
[5 6]
[7 8]]
沿轴 1 连接两个数组:
[[1 2 5 6]
[3 4 7 8]]

(4)分割数组

函数描述
np.split(ary, indices_or_sections, axis)将数组拆分为多个子数组
np.hsplit(ary,indices_or_sections)将一个数组水平分割为多个子数组(按列)
np.vsplit(ary,indices_or_sections)将一个数组垂直分割为多个子数组(按行)
import numpy as np
 
a = np.arange(9)
print ('将数组分为三个大小相等的子数组:')
b = np.split(a,3)
print (b)  # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
import numpy as np
a = np.arange(4).reshape(2, 2)
print('第一个数组:','\n',a)

b = np.split(a,2)  # 默认分割,按照0轴
print('默认分割(0轴):','\n',b) 

c = np.split(a,2,1) # 按照1轴分割
print('沿水平方向分割:','\n',c)

d= np.hsplit(a,2)
print('沿水平方向分割:','\n',d)

第一个数组:
[[0 1]
[2 3]]
默认分割(0轴):
[array([[0, 1]]), array([[2, 3]])]
沿水平方向分割:
[array([[0],
[2]]), array([[1],
[3]])]
沿水平方向分割:
[array([[0],
[2]]), array([[1],
[3]])]

(5)数组元素的添加与删除

函数描述
np.resize(arr, shape)返回指定大小的新数组
np.append(arr, values, axis=None)在数组的末尾添加值
np.insert(arr, obj, values, axis))沿给定轴在输入数组中插入值
np.delete(arr, obj, axis)返回从输入数组中删除指定子数组的新数组

4. numpy随机抽样

(1)随机数

  • np.random.randn(d0, d1, …, dn)
    根据给定维度生成[0,1)之间的数据,包含0,不包含1,dn表示每个维度的大小
np.random.rand(2, 5) # 生成0-1内2x5维度的随机数

array([ [0.04939478, 0.76997421, 0.68812704, 0.14582689, 0.70170358],
[0.78119438, 0.97073067, 0.43484078, 0.56556003, 0.03293409] ])

  • np.random.randn(d0, d1, …, dn)
    从标准正态分布(均值为0,方差为1)中返回一个或多个样本值。
np.random.randn(1, 10)

array([[-0.12908575, 0.03111365, 2.21828821, 0.82484204, -0.70049814,
0.40385296, 0.57943472, 0.48817047, 1.60132259, 0.05599768]])

  • np.randint(low, high, size, dtype)
    生成 [low, high) 的随机整数,size是数据维度,dtype默认是int。若high为None时,则取值[0,low)之间随机整数。
x=np.random.randint(2,size=5) # 0-2之间的一维数组1x5
y=np.random.randint(1,5,size=(2,3)) # 1-5之间的2x3二维数组
print(x) # [0 0 1 1 0]
print(y)

输出:

[0 0 1 1 0]
[ [3 2 1]
[2 4 3] ]

  • np.random.seed(seed=None)
    seed( ) 用于指定随机数生成时所用算法开始的整数值。如果使用相同的seed( )值,则每次生成的随即数都相同;如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
  • np.random.choice(a, size=None, replace=True, p=None)
    若a为整数,元素取值从np.range(a)中随机获取;若a为数组,取值从a数组元素中随机获取,该方法类似于随机抽样
x = np.random.choice(10, 3) # 从range(10)随机抽取3个数

arr = [1,5,10,-3,6,7]
y = np.random.choice(arr,5) # 从数组中随机抽取5个数
print(x) #  [2 6 1]
print(y) #  [-3 10 -3  5  1]

(2)概率密度函数

  • 离散随机变量
    在这里插入图片描述
函数分布描述
np.random.binomial(n, p, size=None)二项分布size表示采样的次数,n表示做了n重伯努利试验,p表示成功的概率,函数的返回值表示n中成功的次数
np.random.poisson(lam=1.0, size=None)泊松分布size表示采样的次数,lam表示一个单位内发生事件的平均值,函数的返回值表示一个单位内事件发生的次数
np.random.geometric(p,size)几何分布size表示采样次数,p表示成功的概率
  • 连续随机变量
    在这里插入图片描述
函数分布描述
np.random.normal(loc,scale,size)正态分布创建均值为 loc(mu),标准差为 scale(sigma),大小为 size 的数组。
np.random.uniform(low=0.0, high=1.0, size=None)均匀分布在low到high范围内,创建大小为size的均匀分布的随机数
np.random.exponential(scale=1.0, size=None)指数分布scale = 1 λ \frac {1} {\lambda} λ1

5.常用数学函数

  • 三角函数
  • 算数运算
  • 求和,求积
  • 代数运算

具体参见官方文档.

参考链接:
https://www.lanqiao.cn/courses/912/learning/
https://www.runoob.com/numpy/numpy-tutorial.html
https://tianchi.aliyun.com/course/323/3639

比较详细的教程:
Numpy入门详细教程

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值