机器学习中的numpy库

        日常学习中总是遇到数据需要处理等问题,这时候我们就可以借助numpy这个工具来做一些有意思的事。

1.生成随机数的几种方式

x=np.random.random(12) ###生成12个随机数,也可以写成np.random.rand(12)、  
                     np.random.random_integers、np.random.uniform、np.random.randint(np.random.randint(1,20,(3,4),dtype='int32'))、等形式

x=np.random.rand(3,4)  ###生成3行4列12个随机数

x=np.random.normal(0,1,shape=(3,4))   ###生成以0为均值,1为方差的3行4列12个随机数

x=np.arange(12)         ####生成0到11的矩阵

2、运算

(1)常规运算

对于加减就不多说,乘除多说两句,就是乘法需要注意矩阵的点乘(数学正常乘法和np.matmul(a,b.T)效果一样)和*乘(俗称数乘)。例子如下:

除法的话记住   a/b表示带余数除法   a//b表示整除 ,同时需要注意的是对矩阵的以下操作:

  • 条件运算

  • 统计运算

》指定轴最大值amax(参数1: 数组; 参数2: axis=0/1; 0表示列,1表示行)

》指定轴最小值amin

指定轴平均值mean

》指定轴方差std

stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一行的方差(0表示列)
print("每一列的方差:")
result = np.std(stus_score, axis=0)
print(result)
​
# 求每一行的方差(1表示行)
print("每一行的方差:")
result = np.std(stus_score, axis=1)
print(result)

(2)广播机制

广播”指的是在不同维度的数组之间进行算术运算的一种执行机制,其通过将数据矢量化进行高效的运算,而不是按照传统的对标量数据进行循环运算达到目的。需要注意,执行 broadcast 的前提在于,两个 ndarray 执行的是 element-wise(按位加,按位减) 的运算,而不是矩阵乘法的运算,矩阵乘法运算时需要维度之间严格匹配。(且矩阵乘法,np.dot(A, B) 如果维度不匹配,提示的错误不会是 broadcast,而是 aligned)

“广播”的一个工作原则是:两个数组的维度应该相同(即要对一个二维数组进行广播,那么用来广播的数组也应该是二维的),并且只能有一个维度的长度允许不一样,且那个不一样的维度在用来广播的数组里面的长度应该为1(比如,对于一个(3,4)的二维数组,那么用来广播的数组必须是(3,1)或(1,4);比如对于一个三维的数组(3,4,5),用来广播的数组必须是(1,4,5)或(3,1,5)或(3,4,1)),这样子,我们才说两个数组是广播兼容的。广播会在沿着长度为1的那个维度进行扩散进行。(这里就知道,为什么我们需要一个长度为1的维度,其实就是广播进行扩散的维度)。例如:

补充注意:

numpy中a.shape为(m,)的数组在矩阵运算的过程中看作行向量处理,及a为1行m列。

3、切片

对于一维数组来说,python原生的list和numpy的array的切片操作都是相同的,记住一个规则arr_name[start: end: step]就可以了。同时需要注意下面几个特殊点:

  • [:]表示复制源列表
  • 负的index表示,从后往前。-1表示最后一个元素。
  • 相对于一维数组而言,二维(多维)数组用的会更多。一般语法是arr_name[行操作, 列操作]

示例:

4、拼接

Python中numpy数组的合并有很多方法,如np.append() 、np.concatenate() 、np.stack() 、np.hstack()(水平拼接) 、np.vstack()(垂直拼接) 、np.dstack()(按位拼接) 其中最泛用的是第一个和第二个。第一个可读性好,比较灵活,但是占内存大。第二个则没有内存占用大的问题。

5、压缩

这里说的压缩指的是将多维数据转化为一维数据的过程,与reshape(-1)拉平多维数据类似,常见的方法有以下三种:

  • ravel()  如果没有必要,不会产生源数据的副本,注意与eval() 函数区分开,它用来执行一个字符串表达式,并返回表达式的值。
  • flatten() 返回源数据的副本
  • squeeze()只能对位数为1的维度降维

 说了numpy的诸多好处,也来说下它的不足吧--不能自动求导。这时我们可以考虑ndarray,而ndarray 和 numpy 的多维数组非常类似。然而, NDArray 提供 GPU 计算和⾃动求梯度等更多功能,这些使得 NDArray 更加适合深度学习。

6、高阶应用

- 快速索引

这部分通常会配合一些逻辑布尔运算,比如

import numpy as np

data=np.random.randint(1,100,size=100)

index1=data>10
res1=data[index1]

index2=np.logical_and(data>10,data<=20)
res2=data[index2]

res3=np.where(data<10,10,data)

-交并集操作

差集 setdiff1d(),异或集 setxor1d(),并集 union1d(),交集 intersect1d(),以及判断是否存在的 in1d() 和 isin() 

import numpy as np
 
# 示例数组
array1 = np.array([1, 2, 3, 4, 5])
array2 = np.array([4, 5, 6, 7, 8])
 
# 交集
intersection = np.intersect1d(array1, array2)
print("交集:", intersection)
 
# 并集
union = np.union1d(array1, array2)
print("并集:", union)

需要注意的是上面函数均针对的是一维矩阵,如果直接输入多维则函数会先将输入flatten然后再计算交并及。如果两个矩阵是bool型,还可以通过and or ^来实现交并集操作。

参考链接:

关于python中numpy的“广播”机制原理的阐述_为什么广播机制比循环快-CSDN博客

在python&numpy中切片(slice)_python slice vs numpy slice-CSDN博客

Python中numpy数组的拼接、合并_python numpy 拼接-CSDN博客

https://www.cnblogs.com/zuichuyouren/p/11487885.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomu_347

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值