三、Python数据挖掘(Numpy库)

目录:

  • 三、Python数据挖掘(Numpy库)
      • 一、Numpy 简介
      • 二、认识N维数组 ndarray 属性
        • 1.ndarray 属性
    • 数组名 = np.array(N维数组)
    • 数组名 = np.array(N维数组, dtype=np.?)
        • 2.ndarray 的形状 shape(tuple)
        • 3.ndarray 的类型 dtype
      • 三、基本操作
        • 1.生成数组的方法
    • 数组名 = np.zeros(shape=?, dtype=?)
    • 数组名 = np.ones(shape, dtype=?)
    • 新数组 = np.array(旧数组)
    • 新数组 = np.copy(旧数组)
    • 数组名 = np.asarray(旧数组)
    • 数组名.flatten()
    • np.linspace(start, stop, num, endpoint, retstep, dtype)
    • np.arange([start, ]stop[, step])
    • np.random.rand(d0, d1,...,dn)
    • np.random.uniform(low=0.0, high=1.0, size=None)
    • np.random.randn(d0, d1,...,dn)
    • np.random.normal(loc=0.0, scale=1.0, size=None)
      • 2.数组的索引和切片
    • 数组名[start:stop]
    • 数组名[row, [start:stop]]
    • 数组名[axis[, row][, start:stop]]
      • 3.数组形状的修改
    • 数组名.reshape(shape)
    • 数组名.resize(shape)
    • 数组名.T
      • 3.数组数据类型的修改
    • 数组名.astype(dtype)
    • 数组名.tobytes()
      • 4.数组的去重
    • np.unique(数组)
      • 四、ndarray 运算
        • 1.逻辑运算
    • 直接使用数组名的逻辑表达式 ⇨ 返回值:布尔数组
    • 数组名[布尔数组]
    • 数组名[布尔数组] = 新的值
    • np.all(布尔数组)
    • np.any(布尔数组)
    • np.where(布尔数组, data1, data2)
      • 2.统计运算
    • np.argmax(数组[, axis=])
    • np.argmin(数组[, axis=])
      • 3.数组间的运算
        • 广播机制 broadcast
      • 4.矩阵运算
    • 矩阵名 = np.array()
    • 矩阵名 = np.mat()
    • np.matmul(a, b, out=None)
    • np.dot(a, b)
    • matrix1 * matrix1
    • ndarray1 @ ndarray2
      • 5.np.matmul() 与 np.dot() 的区别
      • 6.合并与分割
    • np.hstack(*args)
    • np.vstack(*args)
    • np.concatenate(*args, axis=)
    • np.split(ndarray, indices_or_sections, axis=0)
      • 7.IO操作与数据处理
    • np.genfromtxt(fname, delimiter=?)
    • np.count_nonzero(ndarray, axis=None, *, keepdims=False)
    • np.isnan(ndarray)
      • 8.扩展:axis=0或1 的交互方式

一、Numpy 简介

  • 什么是 Numpy?

Numpy 是一个开源的Python科学计算库,用于快速处理任意维度的数组

Numpy 支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy 比直接使用Python要简洁得多

Numpy 使用 ndarray 对象来处理多维数组,该对象是一个快速而灵活的大数据容器

  • ndarray 的简介

Numpy 提供了一个核心的数据结构——N维数组类型ndarray ,它描述了相同类型的 “items” 集合

  • 什么要使用 ndarray 而不使用Python的原生 list?

ndarray与Python的原生 list 比较,其效率远远高于 list

机器学习深度学习的最大特点就是大量的数据运算,那么如果没有一个快速的解决方案,那么可能现在Python也在机器学习领域也无法达到好的效果

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

ndarray 支持并行化运算(向量化运算),适合于机器学习

Numpy 底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码;并且支持多线程

Numpy 中的函数与方法只能作用于 ndarray 对象(重要


二、认识N维数组 ndarray 属性

ndarray 创建的数组中,要求其各元素的数据类型都是相同的,与Python的原生 list 不同,Python的原生 list 可以存储不同数据类型的数据(重要

1.ndarray 属性

通过调用以下方法可以访问到属性值

属性名 含义
ndarray.shape 数组的维度形状,是一个元组
ndarray.ndim 数组维度数
ndarray.size 数组中的元素总数量
ndarray.itemsize 数组中一个元素的长度(字节)
ndarray.dtype 数组元素的类型
  • 数组维度的元组,如:(6, 8) 指的是 6 行 8 列 的二维数组
  • 在用 ndarray 创建数组的时候,如果没有指定类型,则 dtype 默认是整数 int64 或 浮点数 float64
  • shapedtype 是最重要的两种属性

导入模块

import numpy as np

数组名 = np.array(N维数组)

使用ndarray创建一个N维数组

数组名 = np.array(N维数组, dtype=np.?)

指定数据类型地创建一个N维数组
dtype=np. 数据类型属性,如:dtype=np.int64,也可以使用简写 dtype=‘i8’,后面会详细介绍

2.ndarray 的形状 shape(tuple)

例:创建数组

import numpy as np"""创建一个一维数组(3, )"""
list1 = np.array([1, 2, 3])
"""创建一个三维数组(2, 2, 3)"""
list2 = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])

形状如图所示:

它们的 shape 属性分别是:(3, ) 和 (2, 2, 3)

维度的观察应该是从外到内,由大到小——得到形状 shape

提示:由于 shape 是一个元组,因此可以用 shape 的下标来访问 shape 中的具体值,如:三维数组 temp 的元素个数为:sum = temp.shape[0] * temp.shape[1] * temp.shape[2]

3.ndarray 的类型 dtype
名称 含义 简写
np.bool 用一个字节存储的布尔类型(Ture或False) ‘b’
np.int8 一个字节大小,-128~127 ‘i’
np.int16 整数,-32768~32767 ‘i2’
np.int32 整数,-231~231-1 ‘i4’
np.int64 整数,-263~263-1 ‘i8’
np.unit8 无符号整数,0~255 ‘u’
np.unit16 无符号整数,0~65535 ‘u2’
np.unit32 无符号整数,0~232-1 ‘u4’
np.unit64 无符号整数,0~264-1 ‘u8’
np.float16 半精度浮点数,16位,正负号1位,整数5位,精度10位 ‘f2’
np.float32 单精度浮点数,32位,正负号1位,整数8位,精度23位 ‘f4’
np.float64 双精度浮点数,64位,正负号1位,整数11位,精度52位 ‘f8’
np.complex64 复数,分别用两个32位浮点数表示实部和虚部 ‘c8’
np.complex128 复数,分别用两个64位浮点数表示实部和虚部 ‘c16’
np.object_ Python对象 ‘O’
np.string_ 字符串 ‘S’
np.unicode_ unicode类型 ‘U’

在通过 dtype=np.? 指定数据类型时,可以使用名称或简写


三、基本操作

1.生成数组的方法

(1)生成0和1的数组

数组名 = np.zeros(shape=?, dtype=?)

生成元素均为0的数组
shape 指定数组的形状

数组名 = np.ones(shape, dtype=?)

生成元素均为1的数组
shape 指定数组的形状

例:指定为 py.int8 类型

(2)从现有数组中生成

新数组 = np.array(旧数组)

深拷贝旧数组

新数组 = np.copy(旧数组)

深拷贝旧数组

数组名 = np.asarray(旧数组)

浅拷贝旧数组

数组名.flatten()

将多维数组拍扁成一维数组,顺序不变,并返回新的数组
只返回新数组,不改变原数组

  • 一般可以将 Python 的数组转化为 Numpy 的数组
  • 深拷贝:拷贝成新的数组,和旧数组没有关联
  • 浅拷贝:引用旧数组的引用,当旧数组发生变化时,它也跟着发生变化

(3)生成固定范围的有序数组

np.linspace(start, stop, num, endpoint, retstep, dtype)

[start, stop] 之间生成元素值等间距的数组,元素个数为sum
start 数组的起始值,该值包含在内
stop 数组的终止值,该值包含在内
num 要生成的等间距的元素个数,默认为50个(如果 endpoint=True,则该值必须指定)
endpoint 数组中是否包含 stop 值,默认为 True
retstep 如果为True,则返回样例,以及连续数字之间的步长
dtype 输出 ndarray 的数据类型

np.arange([start, ]stop[, step])

[start, stop) 之间,用法和Python中的 range() 一样

例:

(4)生成随机数组

生成随机数组,包括两种分布状况:均匀分布正态分布

需要使用 np.random 模块

均匀分布

np.random.rand(d0, d1,…,dn)

[0.0, 1.0) 之间生成一个均匀分布的随机数数组,d0~dn可以指定其数组形状,如:np.random.rand(2, 3),生成 shape=(2, 3) 的二维数组
rand() 即没有指定形状,返回一个浮点数

np.random.uniform(low=0.0, high=1.0, size=None)

[low, high) 之间生成一个均匀分布的随机数数组
low 采样下界,float 类型,默认值为0.0
high 采样上界,float 类型,默认值为1.0
size 输出样本数目,为 intshape ,例如:size=(m, n, k),则生成 shape=(m, n, k) 的数组,缺省时生成一个元素

例:np.random.rand(…)
np.random.rand() 返回一个浮点数
np.random.rand(1) 返回一个包含1个元素的一维数组
np.random.rand(2) 返回一个包含2个元素的一维数组
np.random.rand(5, 8) 返回一个包含5 × 8 = 40个元素的二维数组

例:np.random.rand(…) 的均匀度验证

import numpy as np
import matplotlib.pyplot as plttemp_list = np.random.rand(1000000)"""绘图"""
plt.figure(figsize=(5, 5), dpi=100)
plt.hist(temp_list, 100)
plt.show()

例:np.random.uniform(…) 的均匀度验证

import matplotlib.pyplot as plttemp_list = np.random.uniform(low=0.0, high=1.0, size=1000000)plt.figure(figsize=(5, 5), dpi=100)
plt.hist(temp_list, 100)
plt.show()


正态分布

正态分布是一种概率分布,它是具有有两个参数 μσ 的连续型随机变量的分布,其中 μ 是服从正太分布的随机变量的均值σ2 是此随机变量的方差,所以正态分布记作 x~N (μ, σ2)

简单来说, μ 决定了正态分布图 对称轴的位置/最大值点;而 σ 则决定了正态分布图的 粗细程度最大值

  • σ2 越小时,正态分布图越细高最大值越大
  • σ2 越大时,正态分布图越粗扁最大值越小

此外,x~N (0, 1) 被称为标注正态分布

np.random.randn(d0, d1,…,dn)

标准正态分布中生成一个数组,d0~dn可以指定其数组形状,如:np.random.randn(2, 3),生成 shape=(2, 3) 的二维数组
randn() 即没有指定形状,返回一个浮点数

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

正态分布的概率生成一个数组
loc 概率分布的均值 μfloat 类型,默认值为0.0
scale 概率分布的标准差 σfloat 类型,默认值为1.0
size 输出样本数目,为 intshape ,例如:size=(m, n, k),则生成 shape=(m, n, k) 的数组,缺省时生成一个元素

例:np.random.randn(…)np.random.normal(…) 的正态分布验证

import numpy as np
import matplotlib.pyplot as plttemp_list = np.random.randn(1000000)plt.figure(figsize=(5, 5), dpi=100)
plt.hist(list1, 1000)
plt.show()
import numpy as np
import matplotlib.pyplot as plttemp_list = np.random.normal(loc=0.0, scale=1.0, size=1000000)plt.figure(figsize=(5, 5), dpi=100)
plt.hist(list1, 1000)
plt.show()

2.数组的索引和切片

索引数组中的某一元素

数组名[d0, d1,…,dn]
访问数组的某一元素
d0, d1,…,dn 按形状分布的下标选取即可

切片/访问一维数组中某一范围的元素

数组名[start:stop]

切片/访问—→行下标[start, stop) 区间内的数组元素,返回一个数组

切片/访问二维数组中某一范围的元素

数组名[row, [start:stop]]

切片/访问二维数组 中—→行下标row列下标[start, stop) 区间内的数组元素,返回一个数组
start:stop 缺省时,表示访问—→行下标row 的行
row 也可以写成 start:stop 的形式,表示行下标[start, stop) 区间的范围内

切片/访问三维数组中某一范围的元素

数组名[axis[, row][, start:stop]]

切片/访问三维数组中—→轴下标axis行下标row列下标在下标在 [start, stop) 区间内的数组元素,返回一个数组
row, start:stop 缺省时,表示访问—→轴下标axis 的平面
start:stop 缺省时,表示访问—→轴下标axis行下标row的行
axis 也可以写成 start:stop 的形式,表示轴下标[start, stop) 区间的范围内
row 也可以写成 start:stop 的形式,表示行下标[start, stop) 区间的范围内

  • start 均可以缺省,默认值为0
  • stop 也可以缺省,默认访问到数组最后

例:

此外axisrow 也可以用 start:stop 代替:

如:数组名[0:2, 0:5] 表示数组的第0~1行中的第0~4列的元素

3.数组形状的修改

数组对象调用方法

数组名.reshape(shape)

把当前数组返回shape 的形状,元素的所有顺序 [start, stop)不发生改变
只返回新数组,不改变原数组

数组名.resize(shape)

直接对当前数组进行修改改变原数组,没有返回值,元素的所有顺序 [start, stop)不发生改变

数组名.T

返回一个 转置 后的二维数组,把行变为列,把列变为行,元素的所有顺序 [start, stop) 发生了改变
只返回新数组,不改变原数组

例:数组名.reshape(shape)

例:使用 数组名.reshape(shape) 时,如果只想指定列数不想计算行数可以用 -1 代替

例:数组名.T

3.数组数据类型的修改

数组名.astype(dtype)

将当前数组的数据类型转化为 dtype,并返回
只返回新数组,不改变原数组

数组名.tobytes()

把数组转化成二进制的 bytes 类型存储并返回,序列化到本地时使用
只返回新数组,不改变原数组

  • 如果遇到 IOPub data rate exceeded 错误,原因是:
    Jupyter Notebook 中对输出的字节数有限制,可以修改配置文件
    不过这个错误仅仅影响显示出来的内容数,对函数的功能没有影响,不必理会
4.数组的去重

np.unique(数组)

将数组拍扁为一维数组(即可以作用于多维数组),并进行去重,返回新数组
只返回新数组,不改变原数组

例:


四、ndarray 运算

1.逻辑运算

直接使用数组名的逻辑表达式 ⇨ 返回值:布尔数组

布尔逻辑表达式 ⇨ 返回值: 布尔数组
进行基本的逻辑运算,该表达式记为“布尔数组”重要
布尔数组:由 TrueFalse 组成的数组

例:

例:

数组名[布尔数组]

布尔索引,索引布尔数组中为 True 的元素,并返回这些元素组成的数组
下标访问数组的一种办法——布尔索引

数组名[布尔数组] = 新的值

布尔数组中为 True 的元素进行统一的赋值为新的值,并返回新数组(基于布尔数组中的旧数组)

例:

例:

  • 其他逻辑运算符均适用

通用判断函数

np.all(布尔数组)

布尔数组中只要有一个 False 就返回 False

np.any(布尔数组)

布尔数组中只要有一个 True 就返回 True

例:np.all(布尔数组)

例:np.any(布尔数组)

三元运算符

np.where(布尔数组, data1, data2)

判断布尔数组中的内容,True 的元素全部赋值为 data1False 的元素全部赋值为 data2,,并返回新数组(基于布尔数组中的旧数组)

例:

想要进行更复杂的运算,需要使用布尔逻辑运算函数

布尔逻辑运算函数 含义
np.logical_and(布尔数组1, 布尔数组2) 逻辑与
np.logical_or(布尔数组1, 布尔数组2) 逻辑或
np.logical_not(布尔数组1, 布尔数组2) 逻辑非
np.logical_xor(布尔数组1, 布尔数组2) 逻辑异或

例:把数组中 > 0.5< -0.5 的元素置1,否则置0

2.统计运算

在数据挖掘/机器学习领域,统计指标的值也是我们分析问题的一种方式,常用的有:最大值max最小值min平均值mean中位数median方差var标准差std

统计相关函数

统计运算函数 含义
np.max(数组[, axis=]) 找到数组中最大值元素
np.min(数组[, axis=]) 找到数组中最小值元素
np.mean(数组[, axis=]) 统计数组的平均值
np.median(数组[, axis=]) 找到数组的中位数
np.var(数组[, axis=]) 统计数组的方差
np.std(数组[, axis=]) 统计数组的标准差
  • axis 指定按行或按列运算:
    axis=0 表示按列统计,即分别统计每一中的 ( max 或 min 或 mean…)
    axis=1或-1 表示按行统计,即分别统计每一中的 ( max 或 min 或 mean…)

例:按行统计最大值

寻找最大值、最小值所在位置

np.argmax(数组[, axis=])

找到数组中最大值元素,返回其所在位置——下标

np.argmin(数组[, axis=])

找到数组中最小值元素,返回其所在位置——下标

  • axis 指定按行或按列运算:
    axis=0 表示按列统计,即分别统计每一中的 ( max 或 min 或 mean…)
    axis=1或-1 表示按行统计,即分别统计每一中的 ( max 或 min 或 mean…)
  • 当有多个最大值或最小值时,返回首个查找到的最大值/最小值的下标值

例:寻找最大值的位置,分别用 总体按行

3.数组间的运算

:Python的原生 list 是没有这些功能的

数组与数之间的运算

例:

例:

数组与数组之间的运算

广播机制 broadcast

若想要让两不同形状的数组之间能够进行运算,它们需要满足广播机制

解析——推导(重点

我们发现,不同的数组之间的运算,不论它们是不是同维数组,只要它们的 shape 中同一列所对应的值是相等的,那么它们之间就能够一一对应,那么它们之间就是可运算


此外,除了 shape 同一列的一一对应之外,我们发现,若 shape 的某一列中其中一个是1,那么这个1就可以对应另一个数组在该列上的所有元素,称为一对多,那么这种一对多的对应也是可以运算的

广播机制

当操作两个数组时,numpy会逐个比较它们的 shape(构成的元组 tuple),只有在 shape 中每一列对应的数 满足下述所有条件下,两个数组之间才能进行数组与数组的运算:

  • 任一列上的两数相等,即满足 “一一对应”
  • 任一列上的两数中,其中一个数是1,即满足 “一对多”

那么两数组之间就是可运算的,满足广播机制后,那么数组之间的运算就是简单的——对应的元素通过运算符号进行运算即可 (+、-、*、/)


A (256, 256, 3)
B (3, )
col(d2) 列上,满足3对应3,因此A、B之间是可运算的

A (9, 1, 7, 1)
B (8, 1, 5)
axis(d1) 列上,满足1对8;在 row(d2) 列上,满足1对7;在 col(d3) 列上,满足1对5,因此A、B之间是可运算的

A (5, 4)
B (1, )
col 列上,满足1对4,因此A、B之间是可运算的

A (15, 3, 5)
B (15, 1, 1)
axis(d0) 列上,满足15对应15;在 row(d1) 列上,满足1对3;在 col(d2) 列上,满足1对5,因此A、B之间是可运算的

A (10, )
B(12, )
col 列上,10和12无法对应,显然A、B之间不可运算

A (2, 1)
B (8, 4, 3)
虽然在 col(d1) 列上,满足1对3;但是在 row(d0) 列上,2和4无法对应,显然A、B之间不可运算

:数组与数组之间的运算

显然,运算结果为new_array = [[1 * 10, 2 * 20], [3 * 10, 4 * 20]]

4.矩阵运算

存储矩阵的两种方式

矩阵名 = np.array()

ndarray 存储矩阵

矩阵名 = np.mat()

matrix 存储矩阵

矩阵 matrix《线性代数》 中的概念,它必须是2维的,矩阵之间的 乘运算 的几何意义是 坐标系或向量的线性变换 ,详见

  • 线性代数的本质——动画+描述(向量、矩阵、线性变换和矩阵乘法)

其运算方法为

np.matmul(a, b, out=None)

两个numpy矩阵相乘

np.dot(a, b)

可用于两个numpy矩阵相乘,也可以用于矩阵与标量(常量)相乘

例:按照平时成绩 0.4 和期末成绩 0.6 的加权值来计算出最终成绩

最终成绩为 (8, 1) 的矩阵,而学生成绩是 (8, 2) 的矩阵,因此,权值应该写成 (2, 1) 的矩阵,即:

  • (8, 2) × (2, 1) = (8, 1)

数据
grade = np.array([[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]])

import numpy as npgrade = np.array([[80, 86], [82, 80], [85, 78], [90, 90], [86, 82], [82, 90], [78, 80], [92, 94]])
weighting = np.array([[0.4], [0.6]])np.matmul(grade, weighting)


扩展

matrix1 * matrix1

matrix 存储的两个矩阵可以直接用 * 相乘

ndarray1 @ ndarray2

ndarray 存储的两个矩阵可以用 @ 相乘
:如果两 ndarray 使用 * 来进行运算, ndarray 将被视作数组,数组之间的运算需要满足广播机制

5.np.matmul() 与 np.dot() 的区别
  • 二者都是矩阵乘法
  • np.matmul() 不允许矩阵与标量(常量)相乘
  • 在矢量与矢量的内积运算中,np.dot()np.matmul() 没有区别
  • np.matmul() 中,可以传入N(N>2)维的数组

在 np.matmul() 传入N(N>2)维的数组时,它会作如下的处理

  • 首先会把N(N>2)维数组最后两个维度作为矩阵堆栈——即把数组的 shape (d0, d1, d2, … , dn)(dn-1, dn) 视为完整的矩阵——矩阵堆栈,然后再对两者之间的矩阵进行 “一一对应” 或者 “一对多”(详见广播机制) 的矩阵相乘运算,因此N(N>2)维的数组需要满足广播机制
  • 简单来说,它是把N(N>2)维数组中的 shape (d0, d1, d2, … , dn) 中的 dn-1 和 dn 视为 d′(一个矩阵),于是这个N(N>2)维数组变为 shape (d0, d1, d2, … , dn-2, d′),因此这个数组要想跟另一个数组进行运算,就需要满足数组运算之间的广播机制,在满足广播机制之后,两个数组的 矩阵d′ 之间就可以进行 “一一对应” 或者 “一对多” 的运算

例:

import numpy as npa = np.arange(2 * 2 * 4).reshape((2, 2, 4))
b = np.arange(2 * 2 * 4).reshape((2, 4, 2))
c = np.arange(1 * 2 * 4).reshape((1, 4, 2))
np.matmul(a, b)
np.matmul(a, c)

首先讨论 np.matmul(a, b)

对于矩阵 a,它在 np.matmul() 中会被理解成 两个 2×4 的矩阵
对于矩阵 b,它在 np.matmul() 中会被理解成 两个 4×2 的矩阵

因此运算结果为 out[ ] :

其次是 np.matmul(a, c)

因此运算结果为 out[ ] :

6.合并与分割

数组水平合并/拼接

np.hstack(*args)

对数组元组 *args 中的数组进行 水平 方向上的合并
*args 数组元组,如:(ndarray1, ndarray2, … , ndarrayn)

例:

例:

数组竖直合并/拼接

np.vstack(*args)

对数组元组 *args 中的数组进行 竖直 方向上的合并
*args 数组元组,如:(ndarray1, ndarray2, … , ndarrayn)

例:

np.concatenate(*args, axis=)

对数组元组 *args 中的数组进行 水平或竖直 方向上的合并
*args 数组元组,如:(ndarray1, ndarray2, … , ndarrayn)
**kwargs 中,axis=? 可以指定进行 水平或竖直 的拼接

  • axis 指定按行或按列进行拼接:
    axis=0 表示进行竖直拼接(列方向)
    axis=1或-1 表示进行水平拼接(行方向)

例:(注:这里的 数组b 进行了 T 转置)

例:将第一行和第三行的数据进行水平拼接

数据
stock_rate = [[1.18713375, 0.77624391, -0.47452542], [-1.22011298, 1.26038645, 0.10170957], [-0.67131837, 1.47798017, -0.69569189]]

数组分割

np.split(ndarray, indices_or_sections, axis=0)

对数组进行指定份数的分割
ndarray 为需要分割的数组
indices_or_sections 为指定的分割参数,可以是:

  • 整数——平均分成整数份,如:3,即把 ndarray 平均分成3分
  • 整数数组——以数组中的整数元素作为索引,索引对应 ndarray 中的元素作为分隔,如:[1, 2, 3],即把 ndarray 中下标为1、2、3的元素作为分隔,其中,分隔元素将作为下一个数组的首元素

例:

例:

7.IO操作与数据处理

Numpy 读取数据文件

np.genfromtxt(fname, delimiter=?)

把数据文件读取到 ndarray 数组中
fname 文件路径和文件名,文件名包含扩展名
delimiter=? 分隔符,用于区分不同元素,不会将分隔符读入数组

  • 分隔符区分一维数组的不同元素,不同的行则为二维数组中的不同列

例:


发现,对于字符串数据空格数据都会读取成 缺失值nan(dtype 为 float64)

如何处理缺失值

思路1

直接删除含有缺失值的样本

思路2

替换/插补——按列求平均值,用平均值来填补 缺失值nan

例:替换/插补 nan 的函数定义

import numpy as npdef fill_nan_by_column_mean(t):for i in range(t.shape[1]):# 获取nan的个数nan_num = np.count_nonzero(t[:, i][t[:, i] != t[:, i]])if nan_num > 0:# 获取当前列的元素now_col = t[:, i]# 求和now_col_not_nan = now_col[np.isnan(now_col) == False].sum()# 和/个数now_col_mean = now_col_not_nan / (t.shape[0] - nan_num)# 赋值给now_colnow_col[np.isnan(now_col)] = now_col_mean# 赋值给t,即更新t的当前列t[:, i] = now_colreturn t
  • 比较复杂,以后我们将会介绍 Pandas 库来处理这些数据

上述所用函数

np.count_nonzero(ndarray, axis=None, *, keepdims=False)

用于统计数组中非零元素的个数
ndarray 被统计的数组
axis=None 指定是否按轴统计,指定后则按行/列分别进行非零元素的统计
keepdims 未知…

np.isnan(ndarray)

逐个检查 ndarray 中的值是否为 nan,并以布尔数组的形式返回

  • axis 指定按行或按列运算:
    axis=0 表示进行水平拼接
    axis=1或-1 表示进行竖直拼接

例:

8.扩展:axis=0或1 的交互方式

在很多函数中,我们多使用到了 axis=0或1 的参数,但我们只是针对二维数组来进行简要说明,在这里,我们将对 axis=0或1 的用法进行 N(N>2)维数组 的展开:

在传递 axis=0或1 参数的函数中,我们需要明确一点:

  • 假设这个 N(N>2)维数组 的形状为:shape (d0, d1, d2, …, dn)

那么首先要对 N(N>2)维数组 进行降维度,它会把 shape (d0, d1, d2, …, dn)N(N>2)维数组 先拆分成 d0 个 N-1(N>2)维数组,这个时候 axis=0或1 就很好解读了:

  • 对于拆分后的 d0 个 N-1(N>2)维数组,有以下规则:
  • axis=1 时:d0 个 N-1(N>2)维数组,每个数组都在自身内部进行统计,和其他数组没有关联
  • axis=0 时: d0 个 N-1(N>2)维数组,这些数组将会被一一串起来(每个数组的形状是一样的),因此 d0 个数组 之间,每个数组之间的数都是一一串联对应的,如图:

    于是, axis=0 就表示每个数组将会与其他数组之间进行统计,每串数数进行对应统计

例:三维数组

内部按列统计:

外部统计:

例:四维数组

内部统计:

外部统计:

三、Python数据挖掘(Numpy库)相关推荐

  1. Python:numpy库中的一些函数简介、使用方法之详细攻略

    Python:numpy库中的一些函数简介.使用方法之详细攻略 目录 numpy库中的一些函数简介.使用方法 1.np.concatenate() 1.1.函数案例 1.2.函数用法 numpy库中的 ...

  2. Python的Numpy库的ndarray对象常用构造方法及初始化方法

    Python的Numpy库的ndarray对象常用构造方法及初始化方法 本文收集Python的Numpy库的ndarray对象常用的构造方法及初始化方法,会不断更新. 目录 1 直接赋值初始化一个nd ...

  3. python的 numpy库学习总结和介绍(超详细)模块

    目录 前言 numpy是什么? 一.创建数据容器 1.np.array(),通过传递一个列表,元祖来创建 2.np.zeros(),np.ones(),np.empty(),np.full(),传递对 ...

  4. [转载] Python里面numpy库中zeros()的一些问题

    参考链接: Python中的numpy.zeros Python里面numpy库中zeros函数的一些问题 定义 本文记录了在使用numpy库中的zeros函数时遇到的一些问题 定义 用法:zeros ...

  5. python 的numpy库中的mean()函数用法介绍

    这篇文章主要介绍了python 的numpy库中的mean()函数用法介绍,具有很好对参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 mean() 函数定义: 2 mean()函数功能: 求取均 ...

  6. Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作(附实现饱和操作的方法)

    Python的Numpy库的函数astype()在将大范围数据类型转换为小范围数据类型时并不是做饱和(saturate)操作. 关于什么是饱和操作,可以参看博文:https://blog.csdn.n ...

  7. 【Python】Numpy库之符号函数sign()的介绍及用法

    1.sign()函数功能介绍 sign()是Python的Numpy中的取数字符号(数字前的正负号)的函数. 2.sign()函数用法代码演示 #导入numpy库 import numpy as np ...

  8. python的numpy库的基本用法_python numpy库np.percentile用法说明

    在python中计算一个多维数组的任意百分比分位数,此处的百分位是从小到大排列,只需用np.percentile即可-- a = range(1,101) #求取a数列第90%分位的数值 np.per ...

  9. python学习——numpy库

    属性: 维度 元素类型 大小 形状 创建一维 : np.arange np.linspace 注意range()只能for循环 创建零数组 一数组 单位数组 数组拼接: hstack vstack s ...

  10. python下载numpy库_安装numpy库

    1.先安装pip: 下载地址:http://pypi.python.org/pypi/pip#downloads 下载pip-8.1.2.tar.gz(md5,pgp)完成之后,解压到一个文件夹,cm ...

最新文章

  1. 高分辨率扫描出来的图片有摩尔纹_ue4 摩尔纹 远处模型闪烁问题
  2. 索引 - 数据结构 - B+TREE
  3. pg 定时删除_PostgreSQL的时间函数使用整理
  4. Spring 框架基础(03):核心思想 IOC 编程说明,案例演示
  5. mock java 反射,PowerMock,Mockito和反射api的最终类
  6. l2正则化python_回归分析_L2正则化(岭回归)【python实现】
  7. 使用bat向文件的第一行中写入内容
  8. Redis 响应延迟问题排查
  9. 《Adams/view从入门到提高》视频
  10. 服务器系统2008R2安全模式,server 2008 r2怎么进入安全模式
  11. 拉开差距的面试题:如何设计一个电商平台积分兑换系统??
  12. 论文阅读笔记 | Transformer系列——Focal Transformer
  13. 企业级运维——Mysql主从复制(异步、半同步、全同步)
  14. Java版Word开发工具Aspose.Words功能解析:查找和替换Word文档中的文本
  15. 【JVM系列3】方法重载和方法重写原理分析,看完这篇终于彻底搞懂了
  16. 8b10b编码源码 matlab,8b/10b编码技术系列(一):Serdes、CDR、K码
  17. 【Premiere】入门自学 1
  18. Python 终极指南:进阶之路
  19. 郑州大学研究生计算机专业分数线,2019郑州大学研究生分数线(含2016-2019历年复试)...
  20. stagefright 架构分析(六) 创建一个 Soft Decoder

热门文章

  1. GitCode 2021-02-21 升级公告
  2. 中英文说明书丨Abbkine 总蛋白提取试剂盒解决方案
  3. 数据库概念-Lecture1
  4. pyecharts中有关Line的相关事项
  5. identifier “bind“ is undefined 解决方案
  6. 解决uniapp 小程序 vendor.js过大 大于500K 无法转换ES5问题
  7. 兼职网上赚钱,这5种做好了,哪种都能月入过万!
  8. java窗体广告墙(图片上传)java广告系统
  9. java tp_tp90和tp99指标
  10. 【每日一题】——网购