Python之Numpy系列详细教程【从零到入门】 — 第二章 Numpy基本操作

Python之Numpy系列详细教程【从零到入门】 -- 第二章 Numpy基本操作
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

1. 生成数组的方法

1.1 生成0和1的数组

  • np.ones(shape, dtype)

      	生成结果都是1的数组
      	shape: 数组形状维度
      	dtype: 数组类型
    
  • np.ones_like(a, dtype)

      	生成结果都是1的数组,形状和a一致
      	a: ndarray对象
      	dtype: 数组类型
    
  • np.zeros(shape, dtype)

      生成结果都是0的数组
    
  • np.zeros_like(a, dtype)

      生成结果都是0的数组
    

举例如下:

  1. 生成一个4行8列的所有值都是1的ndarray二维数组。
ones = np.ones([4,8])
ones

返回结果:

array([[1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.]])
  1. 生成一个和ones对象形状一致的所有值都是0的ndarray二维数组。
np.zeros_like(ones)

返回结果:

array([[0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0.]])

1.2 从现有数组生成

1.2.1 生成方式

  • np.array(object, dtype)

  • np.asarray(a, dtype)

a = np.array([[1,2,3],[4,5,6]])
# 从现有的数组当中创建
a1 = np.array(a)
# 相当于索引的形式,并没有真正的创建一个新的
a2 = np.asarray(a)

1.2.2 关于array和asarray的不同

在这里插入图片描述

1.3 生成固定范围的数组

1.3.1 np.linspace (start, stop, num, endpoint)

  • 创建等差数组 — 指定数量
  • 参数:
    • start:序列的起始值
    • stop:序列的终止值
    • num:要生成的等间隔样例数量,默认为50
    • endpoint:序列中是否包含stop值,默认为ture
# 生成等间隔的数组
np.linspace(0, 100, 11)

返回结果:

array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.])

1.3.2 np.arange(start,stop, step, dtype)

  • 创建等差数组 — 指定步长
  • 参数
    • step:步长,默认值为1
np.arange(0, 100, 5)

返回结果:

array([ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95])

1.3.3 np.logspace(start,stop, num)

  • 创建等比数列,底数为10
  • 参数:
    • num:要生成的等比数列数量,默认为50
# 生成10^x
np.logspace(0, 2, 3)

返回结果:

array([  1.,  10., 100.])

1.4 生成随机数组

1.4.1 正态分布

  1. 什么是正态分布?
    正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ )。

  2. 正态分布的应用
    生活、生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。例如学校某个班级所有学生的身高情况。

  3. 正态分布特点
    μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。

正态分布创建方式

  • np.random.normal(loc=0.0, scale=1.0, size=None)

    • loc:float

    ​ 此概率分布的均值(对应着整个分布的中心centre)

    • scale:float

    ​ 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

    • size:int or tuple of ints

    ​ 输出的shape,默认为None,只输出一个值

举例1:全国年龄在18-30岁之间的男生身高,均值为1.75,标准差为1。采集样本数据100000000个。

那么就可以生成均值为1.75,标准差为1的正态分布数据,100000000个。

# 生成均匀分布的随机数
x1 = np.random.normal(1.75, 1, 100000000)

# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(20, 10), dpi=100)

# 2)绘制直方图
plt.hist(x1, 1000)

# 3)显示图像
plt.show()

绘制出的图像如下:
在这里插入图片描述

举例2:随机生成4支股票1周的交易日涨幅数据
4支股票,一周(5天)的涨跌幅数据,如何获取?

我们可以模拟生成一组股票的涨跌幅的数据,随机生成涨跌幅在某个正态分布内,比如均值0,方差1。

股票涨跌幅数据的创建:

# 创建符合正态分布的4只股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (4, 5))
stock_change

返回结果:

array([[-0.47571852, -0.54355285,  0.31595262, -1.44941827, -0.07115282],
       [ 0.91669558, -0.78451371, -0.56579387,  0.12939492, -1.51728897],
       [-0.21811146, -1.53754534,  0.68133651,  0.72941602,  0.82041078],
       [-0.51636329,  1.48622405,  1.15117815,  1.67979461,  0.37039287]])

1.4.2 均匀分布

  • np.random.uniform(low=0.0, high=1.0, size=None)
    • 功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开, 即包含low,不包含high.
    • 参数介绍:
      • low: 采样下界,float类型,默认值为0;
      • high: 采样上界,float类型,默认值为1;
      • size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出mnk个样本,缺省时输出1个值。
    • 返回值:ndarray类型,其形状和参数size中描述一致。

举例: 随机生成1亿个-1到1的数字。

# 生成均匀分布的随机数
x2 = np.random.uniform(-1, 1, 100000000)

画图看分布状况:

import matplotlib.pyplot as plt

# 生成均匀分布的随机数
x2 = np.random.uniform(-1, 1, 100000000)

# 画图看分布状况
# 1)创建画布
plt.figure(figsize=(10, 10), dpi=100)

# 2)绘制直方图
plt.hist(x=x2, bins=1000)  # x代表要使用的数据,bins表示要划分区间数

# 3)显示图像
plt.show()

在这里插入图片描述
通过上面代码绘制的直方图可以看出,把-1到1区间划分成了1000份,那么这生成的1亿个数字,每个区间数字分布的个数大致都在100000个。这种就属于均匀分布。

2. 数组的索引、切片

一维、二维、三维的数组如何索引?

  • 直接进行索引,切片
  • 对象[:, :] – 先行后列

二维数组索引方式:

  • 举例:获取上述代码中生成的第一个股票的前3个交易日的涨跌幅数据
# 二维的数组,两个维度 
stock_change[0, 0:3]

返回结果:

array([-0.47571852, -0.54355285,  0.31595262])

3. 形状修改

3.1 ndarray.reshape(shape, order)

  • 返回一个具有相同数据域,但shape不一样的视图
  • 行、列不进行互换
# 在转换形状的时候,一定要注意数组的元素匹配
stock_change.reshape([5, 4])
stock_change.reshape([-1,10])  # 数组的形状被修改为: (2, 10), -1: 表示通过待计算

3.2 ndarray.resize(new_shape)

  • 修改数组本身的形状(需要保持元素个数前后相同)
  • 行、列不进行互换
stock_change.resize([5, 4])
# 查看修改后结果
stock_change.shape
(5, 4)

3.3 ndarray.T

  • 数组的转置
  • 将数组的行、列进行互换
stock_change.T.shape
(4, 5)

4. 类型修改和数组去重

4.1 ndarray.astype(type)

  • 返回修改了类型之后的数组
stock_change.astype(np.int32)

修改后类型会转换为np.int32。

4.2 np.unique()

temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
>>> np.unique(temp)
array([1, 2, 3, 4, 5, 6])

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

Dragon少年 | 文

如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

本文来源Dragon少年,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/13850

发表评论