Python之三大基本库——Numpy(3)

接着上述内容继续更新,这篇开始讲解数学统计函数

八、数学统计函数

1、常用的数学统计函数


如下声明了一些函数并展示结果:

import pandas as pd
import numpy as np
arr= np.arange(12).reshape(3,4)

data = [['sum',np.sum(arr)],
        ['prod',np.prod(arr)],
        ['cumsum',np.cumsum(arr)],
        ['cumprod',np.cumprod(arr)],
        ['min',np.min(arr)],
        ['max',np.max(arr)],
        ['percentile',np.percentile(arr,[25,50,75])],
        ['quantile',np.quantile(arr,[0.25,0.5,0.75])],
        ['median',np.median(arr)],
        ['mean',np.mean(arr)],
        ['std',np.std(arr)],
        ['var',np.var(arr)]]
df = pd.DataFrame(data, columns=[ 'type','result'])
df

为了更直观的显示结果,我们用表格进行展示: 

扩展:加权平均函数averge,weight就是加权系数,指的是每个数组的系数 

2、如何根据不同的axis(轴)进行计算

以上函数,都有一个参数叫做axis用于指定计算轴为行还是列,如果不指定,那么会计算所有元素的结果

对于低维数组来说(例如二维数组)axis=0代表行、axis=1代表列
对于sum/mean/media等聚合函数:
理解1:axis=0代表把行消解掉,跨行计算(行索引),axis=1代表把列消解掉,跨列计算(列索引)

但是对于高维数组来说(例如三维或更多维度),asix相当于是立体的面,x,y,z,也有了axis=0,1,2...

多维数组不是很好理解,这涉及到了一些数学方面的内容,axis就代表了[ ]的维度,这样计算的话可能需要深入理解,一下两位博主有了很好的总结,大家可以进行参考:

Python中axis=0与axis=1指的方向有什么不同详解_python_脚本之家

Python的numpy中axis=0、axis=1、axis=2解释-CSDN博客

简单来说,对于多维数组来说,axis=0代表第一维度,axis=1代表第二维度,axis=2代表第三维度,我就不具体举例子了,平时项目没用到这么深 ,有需要的话我回来后续更新


3、实例:机器学习将数据进行标准化

arr如果对应到现实世界的一种解释:
行:每行对应一个样本数据
列:每列代表样本的一个特征


数据标准化(就是统一相同的维度,就像秦始皇统一度量衡的道理,同种类型的数据进行比较或计算):
对于机器学习、神经网络来说,不同列的量纲应该相同,训练收敛的更快;                                    比如商品的价格是0到100元、销量是1万到10万个,这俩数字没有可比性,因此需要先都做标准化;                                                                                                                                                    不同列代表不同的特征,因此需要axis=0做计算
标准化一般使用A=(A-mean(A,axis=0))/std(A,axis=0)公式进行

# 1、计算每列的均值
mean = np.mean(arr,axis=0)
mean
# 2、计算每列的标准差
std = np.std(arr,axis=0)
std
# 3、计算分子,注意每行都会分别减去[4.,5.,6.,7.],这叫做numpy的广播
fenzi = arr-mean
fenzi
result = fenzi/std
result

结果如下:

扩展,numpy的广播broadcast

在Python中,NumPy的广播(broadcasting)是一种机制,用于在算术运算中处理不同形状的数组。当进行运算时,NumPy会自动扩展较小数组,以便它们的形状相匹配。这种扩展过程不会修改原始数组,只会在计算过程中临时展开它们。

广播的规则简单来说有以下几点:

  1. 如果两个数组在任何维度上都没有相同的大小,则其中一个数组会在最小的维度上广播。

  2. 如果一个数组的形状是1的,那么它可以被广播成任何形状。

  3. 如果一个数组的形状在某个维度上是1,它可以在这个维度上和任何其他维度的数组进行广播操作。

  4. 当两个数组在对应维度上的大小有一个是1,或者其中一个数组在某个维度上没有存在时,可以进行广播。

下面是一个使用NumPy广播的例子:

import numpy as np

# 创建两个形状不同的数组

a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状为 (2, 3)

b = np.array([1, 2, 3]) # 形状为 (3,)

# 广播机制会使得 b 在第一维上广播,与 a 的形状相匹配

result = a + b # 等价于 a + b[:, np.newaxis]

print(result)

输出结果将会是:

[[2 4 6]

[5 7 9]]

在这个例子中,数组 b 被广播以匹配数组 a 的形状,b 在第一维上广播成形状为 (1, 3),也就是复制成[[1, 2, 3],[1, 2, 3]],然后与 a 进行加法运算。有兴趣的小伙伴可以自己搜索深入了解一下。

九、一些关于Numpy常用的简单示例

1、Numpy增加维度

例如我们收到的是一维数组[1,2,3],但是我们需要使用二维数组作为数据源绑定,例如在机器学习中,多增加一个维度表示会多一个样本数据,如何在不改变数据的情况下升级成[[1,2,3]]的形式呢?有如下三种方法:

(1)np.newaxis:关键字,使用索引的语法给数组添加维度(np.newaxis 其实就是 None,也可以用None来代替)

# 首先声明一个一维数组
import numpy as np
arr = np.arange(5)

#在行的基础上添加维度
arr[np.newaxis,:] # 结果 array([[0, 1, 2, 3, 4]]) shape (1, 5)

#在列的基础上添加维度
arr[:,np.newaxis] # 结果 array([[0],[1],[2],[3],[4]]) shape(5, 1)

(2)np.expand_dims(arr,axis):方法,和np.newaxis实现一样的功能给arr在axis位置添加维度

 

(3)np.reshape(a,newshape):方法,给一个维度设置为1完成升维,newshape是一个数字时就是一维,是元组时就代表多维。

# newshape是一个数字时就是一维
np.reshape(arr,5)  # 结果:array([0, 1, 2, 3, 4])

# 在行的基础上添加维度 ,一行5列
np.reshape(arr,(1,5))  结果:array([[0, 1, 2, 3, 4]])
# 但是很多时候我们不能确定一维数组里面有多少数据的时候,就可以用(1,-1)来表示
np.reshape(arr,(1,-1))  结果:array([[0, 1, 2, 3, 4]])


# 在列的基础上添加维度 ,一列5行
np.reshape(arr,(-1,1))  # 结果 array([[0],[1],[2],[3],[4]]) shape(5, 1)

同时有升维也就意味着有降维,我们可以用flatten函数、ravel函数、squeeze函数、reshape来实现降维

使用.flatten()方法:这个方法会返回一个新的数组,其中包含原始数组的元素,但是已经被扁平化(降低到1维)。

import numpy as np
 
# 创建一个二维数组
array = np.array([[1, 2, 3], [4, 5, 6]])
 
# 使用flatten方法降维
flattened_array = array.flatten()
 
print(flattened_array)  # 输出: [1 2 3 4 5 6]
使用.ravel()方法:这个方法也会返回扁平化后的数组,但是如果原数组是非连续的,.ravel()会进行复制,而.flatten()则会首先试图返回视图。

import numpy as np
 
# 创建一个二维数组
array = np.array([[1, 2, 3], [4, 5, 6]])
 
# 使用ravel方法降维
raveled_array = array.ravel()
 
print(raveled_array)  # 输出: [1 2 3 4 5 6]
使用reshape方法:这个方法可以返回一个具有新形状的数组,但是原始数组的元素个数必须保持不变。

import numpy as np
 
# 创建一个二维数组
array = np.array([[1, 2, 3], [4, 5, 6]])
 
# 使用reshape方法降维
reshaped_array = array.reshape(-1)
 
print(reshaped_array)  # 输出: [1 2 3 4 5 6]
使用squeeze方法:这个方法可以删除数组形状中单维度为1的轴。

import numpy as np
 
# 创建一个二维数组,其中一个维度大小为1
array = np.array([[1], [2], [3]])
 
# 使用squeeze方法降维
squeezed_array = array.squeeze()
 
print(squeezed_array)  # 输出: [1 2 3]
使用np.ndarray.item方法:如果数组只有一个元素,你可以使用item()方法来获取这个元素的值。

import numpy as np
 
# 创建一个一维数组
array = np.array([1])
 
# 使用item方法获取单个元素
item = array.item()
 
print(item)  # 输出: 1
选择哪种方法取决于你的具体需求和数组的状态。例如,如果你想要修改原始数组,那么.flatten()将不适用,因为它返回的是原始数据的副本。而如果你不需要修改原始数组,那么.flatten()或.ravel()将更为合适。

下面这个博主总结的比较好,大家可以参考一下:

[Python] numpy - 如何对数组进行降维或者升维_numpy 降维-CSDN博客

2、Numpy中非常有用重要的数据合并操作

我们在机器学习的过程中可能会遇到添加数组的过程,例如在原有的基础上添加行或者添加列,添加完之后我们就用到了合并的功能。

以下操作均可以实现数组合并:
(1)np.concatenate(array_list,axis=0/1):沿着指定axis进行数组的合并
(2)np.vstack或者np.row_stack(array_list):垂直vertically、按行row wise进行数据合并      (3)np.hstack或者np.column_stack(array_list):水平horizontally、按列column wise进行数据合并

下面从两方面分别介绍函数:

(1)添加新的多行(注意此时要合并的两个数组列的数量需要保持一致)

import numpy as np
# 首先声明两个二维数组
a = np.arange(6).reshape(2,3)
b = np.random.randint(10,20,size = (4,3))

# concatenate 方法实现行合并
np.concatenate([a,b])

# vstack 方法实现行合并
np.vstack([a,b])

# row_stack 方法事项行合并
np.row_stack([a,b])

(2)添加新的多列(此时两个要合并的数组的行数要保持一致)

import numpy as np
# 首先声明两个新的二维数组
a = np.arange(9).reshape(3,3)
b = np.random.randint(10,20,size = (3,2))

# concatenate 方法实现列合并
np.concatenate([a,b],axis=1)

# hstack 方法实现列合并
np.hstack([a,b])

# column_stack 方法事项列合并
np.column_stack([a,b])

好了,Numpy的基础我们就先讲到这里了,后续会在有时间的情况下继续总结Panada和Matplotlib,大家可以收藏关注一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值