首页 > 技术文章 > 数据分析之numpy模块

yangmeichong 2021-01-25 10:27 原文

1.nunpy模块简介

1.Numpy是高性能科学计算和数据分析的基础包
2.也是pandas等其他数据分析的工具的基础
3.NumPy具有多维数组功能,运算更加高效快速

python安装方法

# python安装
pip install numpy
# 引用方式:
import numpy as np

# anaconda环境下
conda install numpy
'''anaconda已经自动帮助我们下载好了数据分析相关的模块,其实无需我们再下载'''

# 可以看下面计算bmi参数时间比较
numpy计算比python计算快太多

 2.数组概念

  注意:nunpy中的数组,所有的元素必须是相同的数据类型

#  主要是numpy封装的用于数学计算的数据结构
# 一维数组:np.array(列表) np.array(元组)
res = np.array([1,2,3,4])
res1 = np.array((1,2,3,4))
print(type(res),type(res1))
# print(res.dtype)

# 二维数组:np.array([列表,列表]) 使用最为频繁
np.array([
    [1,2,3,4],
    [9,8,7,6]
])
# 三维数组基本不用
np.array([[
    [1,2,3,4],
    [9,8,7,6],
    [4,6,7,2]
]])
1.基于嵌套列表创建二维数组
arr1 = np.array([[1,3,5,7],
                [2,4,6,8],
                [11,13,15,17],
                [12,14,16,18],
                [100,101,102,103]])
2.基于嵌套元组创建二维数组
arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),
                 (3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))

3. 数据类型

布尔型      bool_    
整型       int_ int8 int16 int32 int64
         int32 只能表示(-2**31,2**31-1),因为它只有32个位,只能表示2**32个数
无符号整型    uint8 uint16 uint32 uint64    
         u全称:unsigned
浮点型      float_ float16 float32 float64    
复数型      complex_ complex64 complex128

# 数据类型

import numpy as np
res=np.array([1,1.1,2,3,4.2])
res.dtype

结果:dtype('float64') # 只要有一个浮点型,整个数组都是浮点型

 4.常用属性

1)数组的转换(对高维数组而言)
import numpy as np
li1 = [
      [1,2,3],
      [4,5,6]
] 
a = np.array(li1)
a.T
结果
array([[1, 4],
       [2, 5],
       [3, 6]])
就相当于是将行变成列,列变成行,它也是一个比较常用的方法

参数:
dtype    数组元素的数据类型    
size    数组元素的个数    
ndim    数组的维数    
shape    数组的维度大小(以元组形式)
reshape 修改数组大小

 

import numpy as np
a = np.array([[1,2,3],[4,5,6]])  # a.shape 3  结果:(2, 3)  2行3列

b = a.reshape(3,2)
print (b)
[[1, 2]
[3, 4]
[5, 6]]

5.numpy常用方法

# 如何查看方法提示
# 方式1:shift+tab tab按第二次的时候出现详细方法
np.array

#方式2:问号执行
#np.array?

# arange() ->range的numpy版,支持浮点数
np.arange(1,10,2)
结果:array([1, 3, 5, 7, 9])

# linspace()    类似arange(),第三个参数为数组长度
np.linspace(1,10,20)

# 这个方法与arange有一些区别,arange是顾头不顾尾,而这个方法是顾头又顾尾,在1到10之间生成的二十个数每个数字之间的距离相等的,前后两个数做减法肯定相等

zeros()    根据指定形状和dtype创建全0数组    
    np.zeros((3,4)) # 创建3行4列的数组
ones()    根据指定形状和dtype创建全1数组    
    np.ones((3,4))
empty()    根据指定形状和dtype创建空数组(随机值)    
    np.empty(10)
eye()    根据指定边长和dtype创建单位矩阵
    np.eye(5)

6.索引与切片

1、在一维数组中,列表的所有索引方法都可以使用在数组中,而且还可以使用间断索引(花式索引)和逻辑索引;
2、在二维数组中,位置索引必须写成[rows,cols]的形式,方括号的前半部分用于锁定二 维数组的行索引,后半部分用于锁定数组的列索引;
3、如果需要获取二维数组的所有行或列元素,那么,对应的行索引或列索引需要用英文 状态的冒号表示;

'''一维数组'''
# 一维数组与列表在索引取值和切片上一模一样
age = np.array([13,19,22,14,19,11])
age[-1] # 跟列表切片一致,结果:11
age[:3] # 跟列表索引取值一致 结果:array([13, 19, 22])
# 间断索引(花式索引),获取19,14,19
# 数组[[索引值1,索引值2,索引值3]]
age[[1,3,4]]
# 逻辑索引(布尔索引)  使用较为频繁
age < 18
# array([ True, False, False,  True, False,  True])
age[age < 18]
# array([13, 14, 11])

'''二维数组'''
res = np.array([[  1,   3,   5,   7],
       [  2,   4,   6,   8],
       [ 11,  13,  15,  17],
       [ 12,  14,  16,  18],
       [100, 101, 102, 103]])
res[1:3] # 行索引
res[:,1:3] # 列索引
"""res[ 行索引,列索引] # 不写默认所有"""
# 只拿4,6,13,15
res[1:3,1:3]

res[3,3]  # 18
res[3,:]  # array([12, 14, 16, 18])
res[:,1]  # array([  3,   4,  13,  14, 101])
res[0:2,1:3]  # array([[3,5],[4,6]])

7.运算符

# 数学运算符
    +
        数组对应元素的加和
  -
      数组对应元素的差
  *
      数组对应元素的乘积
  /
      数组对应元素的商
  %
      数组对应元素商的余数
  //
      数组对应元素商的整除数
  ** 
      数组对应元素的幂指数
    
# 比较运算符
    >
        等价np.greater(arr1,arr2)
        判断arr1的元素是否大于arr2的元素
    >=
        等价np.greater_equal(arr1,arr2)
        判断arr1的元素是否大于等于arr2的元素
    <
        等价np.less(arr1,arr2)
        判断arr1的元素是否小于arr2的元素
    <=
        等价np.less_equal(arr1,arr2)
        判断arr1的元素是否小于等于arr2的元素
    ==
        等价np.equal(arr1,arr2)
        判断arr1的元素是否等于arr2的元素
    !=
        等价np.not_equal(arr1,arr2)
        判断arr1的元素是否不等于arr2的元素

8. 基本函数

# 常用的数学函数
  np.round(arr)
        对各元素四舍五入
  np.sqrt(arr)
      计算各元素的算术平方根  
  np.square(arr)
      计算各元素的平方值
  np.exp(arr)
      计算以e为底的指数
  np.power(arr, α)
      计算各元素的指数
  np.log2(arr)
      计算以2为底各元素的对数
  np.log10(arr)
      计算以10为底各元素的对数
  np.log(arr)
      计算以e为底各元素的对数
    
# 常用的统计函数(必会)
  np.min(arr,axis)
      按照轴的方向计算最小值
  np.max(arr,axis)
      按照轴的方向计算最大值
  np.mean(arr,axis)
      按照轴的方向计算平均值
  np.median(arr,axis )
      按照轴的方向计算中位数
  np.sum(arr,axis)
      按照轴的方向计算和
  np.std(arr,axis)
      按照轴的方向计算标准差
  np.var(arr,axis)
      按照轴的方向计算方差
  '''
  注意:
      axis=0时,计算数组各列的统计值 
      axis=1时,计算数组各行的统计值
  '''
array([[ 80.5, 60., 40.1, 20., 90.7],
       [ 10.5, 30., 50.4, 70.3, 90.],
       [ 35.2, 35., 39.8, 39., 31.],
       [91.2, 83.4, 85.6, 67.8, 99.]])
'''不使用axis参数'''
# python计算每一行的和
Sum = []
for row in range(res.shape[0]):
    Sum.append(np.sum(arr2[row,:]))
# 计算每一列的平均
Avg = []
for col in range(res.shape[1]):
    Avg.append(np.mean(arr2[:,col]))
    
'''使用axis参数'''
arr2.sum(axis = 1)  # 等价np.sum(arr2, axis = 1)
np.mean(arr2, axis = 0)  # 等价arr2.mean(axis = 0)

9.随机数

numpy中的random子模块
np.random

rand        给定形状产生随机数组(0到1之间的数)    np.random.rand(3,3)
randint    给定形状产生随机整数    np.random.randint(5,size=(2,4))
choice    给定形状产生随机选择    
shuffle    与random.shuffle相同    
uniform    给定形状产生随机数组(随机均匀分布)  np.random.uniform((1,2))产生1,2之间的随机数
normal  随机正态分布
np.random.normal(10,size=(3,3)) # 以10位分隔符取值,靠近10取值多
array([[10.07142027, 11.48868803, 11.53035586],
       [ 9.95786927, 10.79440548, 10.15130168],
       [10.94953714,  8.26487928,  9.43984842]])
 

案例:正规赌场下的结局案例

"""有10000块钱,去某赌场嗨皮
假设输赢概率都是50%(一般赢49%),并且赢一场赚100,输一场亏100
jason总共玩了1500场,可能还剩下多少钱"""

# 总钞票数
money = 10000
# 先利用uniform生成1500次0到1之间的随机均匀分布
r = np.random.uniform(0,1,1500)
# 判断输赢
for time in r:
    if time < 0.5:
        money -= 100
    else:
        money += 100
money
赌场小案例
# 进阶操作(模拟仿真)
'''记录每一次赌局完成后的钞票数'''
money = 10000
pgs = [money]
r = np.random.uniform(0,1,1500)
for time in r:
    if time < 0.5:
        money -= 100
    else:
        money += 100
    pgs.append(money)  
'''提前搂一眼后面会详细讲解的matplotlib模块'''
import matplotlib.pyplot as plt
plt.plot(range(1501),pgs)  # x轴与y轴坐标数据
plt.show()

 

推荐阅读