【数据挖掘】2022数据挖掘之最全Numpy相关使用(实践出真知,看完能上手,最详细教程)

数据挖掘之最全Numpy相关知识

一、概念

1、简介

Numpy是一个开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器

2、软件推荐(Jupyter Notebook)

使用Jupyter Notebook,是IPython的加强网页版,一个开源Web应用程序,是一款程序员和科学工作者的编程/文档/笔记/展示软件。
.ipynb文件格式是用于计算型叙述的JSON文档格式的正式规范

3、软件下载网址以及参考文档

跳转链接:Jupyter官网
对于新手而言一般用Anacomda上的Jupyter,如果不知道如何安装Anaconda软件的话,可以参考我写的Anaconda+tensorflow最有实效总结版(重装6次的血泪总结)

二、基本操作

1、ndarray

NumPy提供了一个N维数组类型ndarray,描述了相同类型的"items"的集合

1.1 ndarray基本使用

# 导入numpy包
import numpy as np

score = np.array([[1,2,3,4,5],
                  [6,7,8,9,10],
                  [11,12,13,14,15],
                  [16,17,18,19,20],
                  [21,22,23,24,25],
                  [26,27,28,29,30],
                  [31,32,33,34,35],
                  [36,37,38,39,40]])
score

结果
在这里插入图片描述

1.2 ndarray与Python原生list运算效率

(1)先生成一个超大数组
import numpy as np
import random
import time

# 先生成一个大数组
python_list = []

for i in range(100000000):
    python_list.append(random.random())
ndarray_list = np.array(python_list)
ndarray_list

结果
在这里插入图片描述

(2)通过两种方式求和比较时间
# 原生python list求和
t1 = time.time()
a = sum(python_list)
t2 = time.time()
d1 = t2 -t1

# ndarray求和
t3 = time.time()
b = np.sum(ndarray_list)
t4 = time.time()
d2 = t4 - t3

结果
在这里插入图片描述

(3)结论

Numpy专门针对ndarray的操作和运算进行了设计,所以数组的存储效率和输入输出性能远优于Python中的嵌套列表,数组越大,Numpy的优势就越明显。

1.3 ndarray与Python原生list存储风格

(1)ndarray

只能存储相同类型的数据,类似于java里的数组,顺序存储,通用性不强。

(2)list

可以存储不同类型的数据,指向不同的位置,无序存储,通用性很强。

1.4 并行化运算

ndarray支持向量化运算

1.5 底层语言

Numpy底层使用C语言编写,内部解除了GIL

1.6 ndarray属性

数组属性反映了数组本身固有的信息

ndarray.shape       数组维度的元组
 --    ndarray.ndim   数组维数
 --    ndarray.size   数组中的元素数量
ndarray.itemsize    一个数组元素的长度(字节)
 --    ndarray.dtype  数组元素的类型
(1)相关代码
# 导入numpy包
import numpy as np

score = np.array([[1,2,3,4,5],
                  [6,7,8,9,10],
                  [11,12,13,14,15],
                  [16,17,18,19,20],
                  [21,22,23,24,25],
                  [26,27,28,29,30],
                  [31,32,33,34,35],
                  [36,37,38,39,40]])
score.shape
score.ndim
score.size
score.dtype
score.itemsize

结果
在这里插入图片描述

1.7 ndarray的形状

(1)一维数组
b = np.array([1,2,3,4])
b.shape

结果
在这里插入图片描述

(2)二维数组
a = np.array([[1,2,3],[4,5,6]])
a.shape

结果
在这里插入图片描述

(3)三维数组
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
c.shape

结果
在这里插入图片描述

1.8 ndarray的类型

(1)创建数组的时候指定类型

方式一

np.array([1.1,2.2,3.3], dtype="float32")

结果
在这里插入图片描述

方式二

np.array([1.1,2.2,3.3], dtype=np.float32)

结果
在这里插入图片描述

2、生成数组的方法

2.1 生成值都为0的数组

import numpy as np

# 1、生成0的数组
np.zeros(shape=(3,4), dtype="float32")

结果
在这里插入图片描述

2.2 生成值都为1的数组

import numpy as np

# 1、生成1的数组
np.ones(shape=[2,3], dtype="int32")

结果
在这里插入图片描述

2.3 从现有的数组生成

(1)浅拷贝

原来的数组中某个数值变化了,该数组同样也会变化。
相当于索引的形式,并没有真正的创建一个新的

 新数组名 = np.asarray(原数组名)

相关代码

import numpy as np

score2 = np.array([[1,2,3,4,5],
                  [6,7,8,9,10],
                  [11,12,13,14,15],
                  [16,17,18,19,20],
                  [21,22,23,24,25],
                  [26,27,28,29,30],
                  [31,32,33,34,35],
                  [36,37,38,39,40]])

# np.asarray()
data1 = np.asarray(score2)

data1

结果
在这里插入图片描述

(2)深拷贝

从原有的数组中,创建一个新的数组
方式一

 新数组名 = np.array(原数组名)

方式二

新数组名 = np.copy(原数组名)

相关代码

data2 = np.array(score2)
data3 = np.copy(score2)

结果
在这里插入图片描述

(3)修改数据后

重新赋值后

score2[1,1] =1000

结果如下,只有浅拷贝的数据发生了变化,深拷贝的数据没发生变化
在这里插入图片描述

3、生成固定范围的数组

3.1 方法一

np.linspace(0,10,5)

结果
在这里插入图片描述

3.2 方法二

np.arange(0,11,5)

结果
在这里插入图片描述

4、生成随机数组

4.1 均匀分布

均匀分布表示可能性相等的含义
相关代码

import numpy as np
import random
import matplotlib.pyplot as plt

data1 = np.random.uniform(low=-1, high=1, size=1000000)

# 1、创建画布
plt.figure(figsize=(20,8),dpi=80)

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

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

结果
在这里插入图片描述

4.2 正态分布

正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值,第二个参数σ是此随机变量的方差,所以正态分布记作N(μ, σ)。
标准差越小,离散程度越小,稳定性越好。
相关代码

import numpy as np
import random
import matplotlib.pyplot as plt

# 正态分布
data4 = np.random.normal(loc=1.75, scale=0.1, size=1000000)

# 1、创建画布
plt.figure(figsize=(20,8),dpi=80)

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

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

结果
在这里插入图片描述

5、切片索引与形状修改

5.1 切片索引

相关代码
首先进行伪随机

import numpy as np

stock_change = np.random.normal(loc=0, scale=1, size=(8, 10))

结果
在这里插入图片描述

(1)切片索引
stock_change[0,:3]

结果
在这里插入图片描述

(2)根据位置索引
stock_change[0,2]

结果
在这里插入图片描述

5.2 形状修改

(1)ndarray.reshape(shape)

返回新的ndarray,原始数据没有改变

stock_change.reshape((10,8))

结果
在这里插入图片描述

(2)ndarray.resize(shape)

没有返回值,对原始的ndarray进行了修改

stock_change.resize((10,8))

结果
在这里插入图片描述

(3)stock_change.T

转置,行变成列,列变成行

stock_change.T

结果
在这里插入图片描述

6、类型修改

6.1 ndarray序列化到本地

stock_change.astype("int32")

在这里插入图片描述

6.2 转换为byte类型

# 先转换为byte类型
stock_change.tostring()

在这里插入图片描述

7、数组的去重

7.1 np.unique(数组名)

对于一维数组或者列表,np.unique() 函数 去除其中重复的元素 ,并按元素 由小到大 返回一个新的无元素重复的元组或者列表。

7.2 相关代码

import numpy as np

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

np.unique(temp)

结果
在这里插入图片描述

7.3 拓展

flatten()是对多维数据的降维函数。
其中flatten(dim)表示,从第dim个维度开始展开,将后面的维度转化为一维.也就是说,只保留dim之前的维度,其他维度的数据全都在dim这一维。

temp.flatten()

在这里插入图片描述

降维后去重

set(temp.flatten())

在这里插入图片描述

三、ndarray运算

1、逻辑运算

1.1 布尔索引


#生成随机数组
arr = np.random.normal(loc=0, scale=1, size=(8,10))

# 将符合逻辑条件的值赋值为1
arr[arr > 0.5] = 1

# 输出arr
arr

结果
在这里插入图片描述

1.2 通用判断函数

(1)np.all(布尔值)

只要有一个False就返回False,只有全是True才返回True
相关代码

# 判断这个区间是否  全部  大于0
np.all(arr[0:2, 0:5] > 0)

结果
在这里插入图片描述

(2)np.any(布尔值)

只要有一个True就返回True,只有全是False才返回False
相关代码

# 判断这个区间是否  有  大于0的
np.any(arr[0:2, 0:5] > 0)

结果
在这里插入图片描述

1.3 三元运算符(np.where)

np.where(布尔值, True的位置的值, False的位置的值)

(1)满足大于0的数,真赋为1,假赋为0
np.where(arr > 0,1,0)

结果
在这里插入图片描述

(2)满足大于0.2且小于1的数,真赋为1,假赋为0
np.where(np.logical_and(arr>0.2 , arr<1), 1, 0)

结果
在这里插入图片描述

(3)满足大于0.5,或小于负0.5,真赋为1,假赋为0
np.where(np.logical_or(arr>0.5 , arr<-0.5), 1, 0)

结果
在这里插入图片描述

2、统计运算

2.1 基础操作

(1)最大值
# 最大值
arr.max()

结果
在这里插入图片描述

(2)最小值
# 最小值
arr.min()

结果
在这里插入图片描述

(3)标准差
# 标准差
arr.std()

结果
在这里插入图片描述

(4)方差
# 方差
arr.var()

结果
在这里插入图片描述

(5)平均值
# 平均值
arr.mean()

结果
在这里插入图片描述

(6)求和
# 求和
arr.sum()

结果
在这里插入图片描述

(7)根据axis来改变行或列得出结果
arr.max(axis=0)

结果
在这里插入图片描述

(8)找到最大值的索引
np.argmax(arr,axis=0)

结果
在这里插入图片描述

(5)找出最小值的索引
np.argmin(arr,axis=0)

结果
在这里插入图片描述

2.2 数组间运算

(1)数组与数的运算

相关代码

import numpy as np

arr = np.array([[1,2,3,2,1,4],[5,6,1,2,3,1]])

# 全都加1
arr + 1

# 全都除以2
arr / 2

结果
在这里插入图片描述

(2)广播机制(Broadcast)

广播(Broadcast)是numpy对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组a和b形状相同,即满足a.shape == b.shape,那么a*b的结果就是a与b数组对应位相乘。(要求:维数相同,各维度的长度相同)
相关代码

a = np.array([[0.0, 0.0, 0.0],
           [10.0,10.0,10.0],
           [20.0,20.0,20.0],
           [30.0,30.0,30.0]])
b = np.array([1.0,2.0,3.0])
a + b

结果
在这里插入图片描述

更便捷的计算方式

c = np.array([0.0, 10.0, 20.0, 30.0])
d = np.array([1.0,2.0,3.0])

a[:, np.newaxis] + b

结果
在这里插入图片描述

2.3 矩阵运算

矩阵和array的区别矩阵必须是2维的,但是array可以是多维的。(数组之间不能够直接运算的)
np.mat() 将数组转换成矩阵类型

2.3.1 两种方法存储矩阵
(1)ndarray存储矩阵
# ndarray存储矩阵
data = np.array([[80, 86],
         [82, 80],
         [85, 78],
         [90, 90],
         [86, 82],
         [82, 90],
         [78, 80],
          [92, 94]
         ])

data

结果
在这里插入图片描述

(2)matrix存储矩阵
# matrix存储矩阵
data_mat = np.mat([[80, 86],
         [82, 80],
         [85, 78],
         [90, 90],
         [86, 82],
         [82, 90],
         [78, 80],
          [92, 94]
         ])

data_mat

结果
在这里插入图片描述

2.3.2 矩阵乘法运算
(1)形状改变
(m, n) * (n, l) = (m, l)

设A为mp的矩阵,B为pn的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,记作C=AB

(2)矩阵乘法api

np.matmul

np.matmul(data, weight)

结果
在这里插入图片描述

np.dot

np.dot(data, weight)

结果
在这里插入图片描述

2.4 合并与分割

(1)先定义两个二维数组
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[3,4,5],[6,7,8]])

结果
在这里插入图片描述

(2)水平方向合并

方式一(np.hstack())

np.hstack((a,b))

结果
在这里插入图片描述

方式二(np.concatenate(, axis=1))

np.concatenate((a,b), axis=1)

结果
在这里插入图片描述

(3)竖直方向合并

方式一(np.vstack())

np.vstack((a,b))

结果
在这里插入图片描述

方式二(np.concatenate(, axis=0))

np.concatenate((a,b), axis=0)

结果
在这里插入图片描述

(4)分割

场景一(np.split(x,3))

x = np.arange(9.0)

np.split(x,3)

结果
在这里插入图片描述

场景二(np.split(x, [3,5,6,10]))

x = np.arange(8.0)

np.split(x, [3,5,6,10])

结果
在这里插入图片描述

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

熊凯瑞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值