Python数据分析之初识numpy常见方法使用案例
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Python数据分析之初识numpy常见方法使用案例,希望能够帮助大家进步!!!
声明与简介
numpy是python数据科学计算的基础包,这个包有多维数据对象ndarray,以及诸多它的派生对象(如:掩码数组、矩阵),同时这些对象还提供了数学,逻辑,形状处理,排序,选择,离散傅立叶变换,基本线性代数,基本统计运算,随机模拟等常见的科学计算方法。
创建ndarray
直接创建ndarray
代码语言:javascript复制#通过np.array直接创建ndarray数组。
import numpy as np
arr1=np.array([4,6,9])
print(type(arr1[2],arr1)
#不难看出这里元素的类型是int
<class 'numpy.int32'> [4 6 9]
类型转换
代码语言:javascript复制此代码由Java架构师必看网-架构君整理
#1 ndarry里定义的数据类型一般都是统一的,如果不统一,在类型可以转换的情况下,可自动进行转换。比如int转float
import numpy as np
arr1=np.array([4.32,6,9])
print(type(arr1[2],arr1)
#不难看出这里元素的类型转换成了float
<class 'numpy.float64'> [4.32 6. 9. ]
# 2 float转str
import numpy as np
arr1=np.array([4.32,'we',9])
print(type(arr1[2],arr1)
#结果
<class 'numpy.str_'>
通过模板创建
元素都是0
代码语言:javascript复制#可以通过np.zeros和np.ones初始化ndarray,指定大小和类型。
#创建一个有3个元素都为0的一维ndarray。
arr1=np.zeros(3,dtype=float)
元素都是1
代码语言:javascript复制此代码由Java架构师必看网-架构君整理
#创建一个3行4列、元素全是1的数组。
arr1=np.ones((3,4),dtype=int)
特定元素
代码语言:javascript复制# 创建一个2行3列、元素全是5.12的数组。
arr1=np.full((2,3),5.12)
等差数组步长法
代码语言:javascript复制可以通过numpy的arange方法进行初始化生成等差ndarray,指定起始值、结尾值、步长(增幅)。
比如生成个以1为起始,每次递增3并以20为最终值的等差数组。注意:这里达不到20。
print(np.arange(1,20,3))
#结果为:
[ 1 4 7 10 13 16 19]
#当然,这里增幅可以是负的,即
print(np.arange(20,1,-3))
#结果为
[20 17 14 11 8 5]
等分数组平均法
代码语言:javascript复制#可以通过起始值和份数来等差划分数组,比如生成3个等差元素从3到15。
print(np.linspace(3,15,3))
#结果,计算方法 (15-3)/3,所以步长为6。
[ 3. 9. 15.]
均匀分布随机数
代码语言:javascript复制#通过np.random模块可以生成随机数,这里是调用其random方法生成均匀的随机数。
均匀分布即指定区间内的点都有相同的概率被取到。
比如:生成2×2的数组,其元素为0到1之间均匀随机数。
print(np.random.random((2,2))) #结果
[[0.15185125 0.52790783] [0.16011147 0.29797948]]
正态分布随机数
代码语言:javascript复制#通过np.random模块可以生成随机数,这里是调用其normal方法生成正太分布的随机数。
其中标准正态分布是均值的0、标准差是1。
print(np.random.normal(0,1,(2,2))) #结果
[[-0.25384836 -2.06285573] [-2.27651345 0.90667998]]
随机整数
代码语言:javascript复制# 1通过np.random模块可以生成随机数,这里是调用其randint方法生成指定类型的随机数。
#生成2到20之间的6个随机数
print(np.random.randint(2,20,6))
#结果,当然也可以指定其它shape的数组。
[ 9 3 12 11 10 12]
生成主对角线数组
代码语言:javascript复制通过np.eye可以生成对角线数组(矩阵)。
print(np.eye(4))
#结果
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
数据类型
数据类型详解
代码语言:javascript复制注:查看某个类型的范围(含最小、大值),可以通过numpy内置的方法,比如查看float16的最大值,可以:
print(np.finfo(np.float16))
#结果
Machine parameters for float16
---------------------------------------------------------------
precision = 3 resolution = 1.00040e-03
machep = -10 eps = 9.76562e-04
negep = -11 epsneg = 4.88281e-04
minexp = -14 tiny = 6.10352e-05
maxexp = 16 max = 6.55040e 04
nexp = 5 min = -max
不过针对float16,我们最大只能定义到65519.0,但输出值为65500.0,而定义为65520.0时则显示为inf(即无限大整数的意思)。
ndarray的基础方法
维度ndim
维度类似我们在空间里看东西的视角,常见的有1维直线、2维平面、3维立体、更高维等。np里应用ndim方法来查看维度。
代码语言:javascript复制print(np.random.randint(1,20,(2,4,5)).ndim)
#结果为,即该数组为3维。
3
#按照长乘宽乘高更好理解些。
形状shape
形状shape是每个形状的大小,返回的是一个元组,这里显然是(2,4,5),一般我们说成是2×4×5的数组。
代码语言:javascript复制print(np.random.randint(1,20,(2,4,5)).shape)
#结果
(2, 4, 5)
大小size
大小统计的是整个数组里的元素个数,这里我们不难知道上述数组总共有2*4*5=40个元素。
代码语言:javascript复制print(np.random.randint(1,20,(2,4,5)).size)
#结果
40
数据类型dtype
数据类型是当前数组里元素的类型,如int、float。
代码语言:javascript复制print(np.random.randint(1,20,(2,4,5)).dtype)
#结果
int32
访问数组元素
代码语言:javascript复制# 1 可以通过数组索引(中括号下标的方式)访问元素。比如访问第1维、第2维、第3维交叉的元素,则可以通过如下方式访问。注意数组索引从0开始。
arr4=np.random.randint(1,20,(2,4,5)) print(arr4,arr4[0][1][2])
#或者
print(arr4,arr4[0,1,2])
#结果,有随机性。
15
# 2 通过想反向取,可以使用索引值:-1、-2…。比如要取元素8,则反向对应的索引值为-2。
print(np.array([2,8,9])[-2])
#结果
8
普通数组切片
代码语言:javascript复制可以访问数组时指定索引范围来访问,即切片形式。
#1 比如访问某1维数组的前4个元素,注意因为python遵循左闭右开,所以最右边的值取不到。即取的索引为0、1、2、3,不包含4。
print(np.array([2,8,9,10,23,27])[:4])
#结果
[ 2 8 9 10]
#2 比如访问某1维数组的第2到第4个元素。原理同上。
print(np.array([2,8,9,10,23,27])[2:4])
#结果
[ 9 10]
#3 索引从某个位置到最后
print(np.array([2,8,9,10,23,27])[4:])
#结果
[23 27]
#4 从后往前取,比如-3到-1,这里也是左闭右开,即-1取不到。
print(np.array([2,8,9,10,23,27])[-3:-1])
#结果
[10 23]
跳跃式数组切片
代码语言:javascript复制#1 索引隔位取,比如从0开始每隔2个索引号取一个元素
print(np.array([2,8,9,10,23,27])[::2])
#结果
[ 2 9 23]
#2 索引隔位指定起始索引位置取,比如索引从3开始每隔2个索引号取一个元素。
print(np.array([2,8,9,10,23,27])[3::2])
#结果
[ 2 9 23]
#3 元素逆转,即输出数组和原数组元素是逆向的。
print(np.array([2,8,9,10,23,27])[::-1])
#结果
[27 23 10 9 8 2]
#4 指定索引值逆转元素,即输出数组是原数组元素从指定索引位置逆序。元素个数是指定的值 1。比如这里输出数组应该是4 1=5个元素。
print(np.array([2,8,9,10,23,27])[4::-1])
#结果
[23 10 9 8 2]
注:高维数据的数据切片类似。
形状转换
代码语言:javascript复制这里是通过调用reshape方法将数组进行形状的转换。比如将一个1维数组转换为2为的,2×3的数组。
print(np.array([2,8,9,10,23,27]).reshape(2,3))
#结果
[[ 2 8 9] [10 23 27]]
合并
代码语言:javascript复制# 1 同维度数组合并,np的concatenate可以合并,合并之后不改变原来的维度。
x=np.array([1,2,3,4])
y=np.array([6,7,8])
print(np.concatenate([x,y]))
#结果
[1 2 3 4 6 7 8]
注:可以合并多个数组,不一定是2个。
#2 不同维度的合并(一般差一个维度)合并时需要指定方向,比如是按列(用np.vstack)、行(np.hstack)
这里vstack的v对应单词vertical即垂直(保持列方向一致)
hstack的h对应单词horizontal即水平(保持行方向一致)
#2.1 vstack 垂直方向合并
x=np.array([1,2,3])
y=np.array([[6,7,8],[9,5,10]])
print(np.vstack([x,y]))
#结果,这里可见列数是对应相等的,即都是3个。
[[ 1 2 3] [ 6 7 8] [ 9 5 10]]
#2.2 hstack 水平方向合并
x=np.array([[1,2,3],[4,5,6]])
y=np.array([[6,7,8],[9,5,10]])
print(np.hstack([x,y]))
#2.2 dstack合并生成新的维
x=np.array([[1,2,3],[3,2,1]])
y=np.array([[6,7,8],[9,5,10]])
print(np.dstack([x,y]))
#结果
[[[ 1 6]
[ 2 7]
[ 3 8]]
[[ 3 9]
[ 2 5]
[ 1 10]]]
拆分
代码语言:javascript复制拆分和合并是相反的操作。
# 1 指定拆分的中间区段,剩下的取区段的头和尾。
x=np.array([1,2,3,4,5,6])
x1,x2,x3=np.split(x,[2,5])
print (x1,x2,x3)
#2 vsplit垂直切分,保持列数不变。这里的拆分的数N比子数组少1,即子数组为N 1。
x=np.array([[1,2,3,4],[5,6,7,8]])
x1,x2=np.vsplit(x,[1])
print (x1,x2)
#结果
[[1 2 3 4]] [[5 6 7 8]]
#3 hsplit垂直切分,保持列数不变。这里的拆分参数N指的是索引位置。会分为2部分。
x=np.array([[1,2,3,4],[5,6,7,8]]) x1,x2,x3=np.hsplit(x,[3]) print (x1,x2,x3)
#结果
[[1 2 3] [5 6 7]]
[[4] [8]]
#4 hsplit垂直切分,保持列数不变。这里的拆分参数可以是个区段,则会分3部分。
x=np.array([[1,2,3,4],[5,6,7,8]]) x1,x2,x3=np.hsplit(x,[2,3]) print (x1,x2,x3)
#结果
[[1 2][5 6]]
[[3] [7]]
[[4] [8]]