机器学习之numpy库

机器学习之numpy库

numpy库概述

  1. Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力。
  2. Numpy是其它数据分析及机器学习库的底层库。
  3. Numpy完全标准C语言实现,运行效率充分优化。
  4. Numpy开源免费。

numpy库历史

  1. 1995年,Numeric,Python语言数值计算扩充。
  2. 2001年,Scipy->Numarray,多维数组运算。
  3. 2005年,Numeric+Numarray->Numpy。
  4. 2006年,Numpy脱离Scipy成为独立的项目。

numpy的核心

numpy的核心:多维数组

  1. 代码简洁:减少Python代码中的循环。
  2. 底层实现:厚内核©+薄接口(Python),保证性能。

numpy基础

ndarray数组

用ndarray类的对象表示n维数组

python 复制代码
import numpy as np

arr= np.ndarray([1, 2, 3 ,4])
print(type(arr))

内存中的ndarray对象

元数据 : metadata

存储对目标数组的描述信息,如:dim count、dimensions、dtype、data等。
实际数据

完整的数组数据

将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高性能。

ndarray数组对象的特点

  1. Numpy数组是同质数组,即所有元素的数据类型必须相同
  2. Numpy数组的下标从0开始,最后一个元素的下标为数组长度减1

ndarray数组对象的创建

np.array(任何可被解释为Numpy数组的逻辑结构)

np.arange(起始值(0),终止值,步长(1))

np.zeros(数组元素个数, dtype='类型')

np.ones(数组元素个数, dtype='类型')

python 复制代码
#方式一:直接创建
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
print(a)

# 方式二:np.arange(起始值,终止值,步长)
b = np.arange(0, 8, 2)
print(b);

#方式三: np.zeros(数据个数,dtype = '数组类型')
c = np.zeros(5, dtype = "int")
print(c)

#方式四:np.ones(数据个数, dtype = '数组类型')
d = np.ones(5, dtype = 'int')
print(d)

ndarray对象属性的基本操作

数组的维度

数组的维度: np,ndarray.shape

python 复制代码
e = np.array([[1,2,3,4],[5,6,7,8]])
print(type(e), e.shape)

元素的类型

python 复制代码
import numpy as np
ary = np.array([
    [1,2,3,4],
    [5,6,7,8]
])
#观察维度,size,len的区别
print(ary.shape, ary.size, len(ary))

数组元素的个数

python 复制代码
ary1 = np.array([
    [1,2,3,4],
    [5,6,7,8]
])
#观察维度,size,len的区别
print(ary1.shape, ary1.size, len(ary1))

数组元素索引(下标)

python 复制代码
import numpy as np
a = np.array([[[1, 2],
               [3, 4]],
              [[5, 6],
               [7, 8]]])
print(a, a.shape)
print(a[0])
print(a[0][0])
print(a[0][0][0])
print(a[0, 0, 0])
for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        for k in range(a.shape[2]):
            print(a[i, j, k])

ndarray对象数组的自定义类型

自定义类型(dtype)有很多方式,这里介绍简单介绍几种方式

方式一:

python 复制代码
import numpy as np

data=[
	('zs', [90, 80, 85], 15),
	('ls', [92, 81, 83], 16),
	('ww', [95, 85, 95], 15)
]

a = np.array(data, dtype='U3, 3int32, int32')
#a = np.array(data, dtype='U3, 3int32, int32')
print(a)
print(a[0], ":", a[0]['f0'], ":", a[0]['f1'], ":", a[0]['f2'])

方式二:

python 复制代码
#方法二:

c = np.array(data, dtype={'names': ['name', 'scores', 'ages'],
                    'formats': ['U3', '3int32', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c[0]['ages'])

切片操作

一维数组切片

python 复制代码
#数组对象切片的参数设置与列表切面参数类似
#  步长+:默认切从首到尾
#  步长-:默认切从尾到首
#数组对象[起始位置:终止位置:步长, ...]
#默认位置步长:1
python 复制代码
import numpy as np

a = np.arange(1, 10)
print(a)  # 1 2 3 4 5 6 7 8 9
print(a[:3])  # 1 2 3
print(a[3:6])   # 4 5 6
print(a[6:])  # 7 8 9
print(a[::-1])  # 9 8 7 6 5 4 3 2 1
print(a[:-4:-1])  # 9 8 7
print(a[-4:-7:-1])  # 6 5 4
print(a[-7::-1])  # 3 2 1
print(a[::])  # 1 2 3 4 5 6 7 8 9
print(a[:])  # 1 2 3 4 5 6 7 8 9
print(a[::3])  # 1 4 7
print(a[1::3])  # 2 5 8
print(a[2::3])  # 3 6 9

这是对一维数组进行切片操作,当然这里要特别注意下,省略参数的地方,

以及如果指明了起点位置以及终点位置,答案是不包括起点位置的,但是包括终点位置

多维数组切片

二维数组切片跟一维数组切片比较类似

二维数组切边,先对行进行切片,然后在对列进行切片,行和列的切片之间用逗号来隔开

这里介绍三维数组切片的案例

python 复制代码
mport numpy as np
a = np.arange(1, 28)
a.resize(3,3,3) #变成三维的3页3行3列
print(a)
#切出1页 
print(a[1, :, :])		
#切出所有页的1行
print(a[:, 1, :])		
#切出0页的1行1列
print(a[0, :, 1])

ndarray数组的掩码操作

为true的正常输出,为false的不输出

python 复制代码
import numpy as np
a = np.arange(0, 10)
mask = [True, False,True, False,True, False,True, False,True, False]
print(a[mask])

多维数组的组合和拆分

组合和拆分分成三个方向,垂直方向,水平方向,深度方向
垂直方向

reshape-->如果是二维数组(指定变成几行几列)

垂直方向组合函数, vstack

垂直方向拆分函数,vsplit

python 复制代码
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)

水平方向

拆分函数 : hsplit

组合函数:hstack

python 复制代码
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组 
c = np.hstack((a, b))
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)

深度方向操作

拆分函数: dsplit

组合函数:dstack

注意 : 进行深度方向操作的,ndarray数组必须至少是三维的

python 复制代码
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
i = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
k, l = np.dsplit(i, 2)

拆分和组合三个方向,通用的函数

python 复制代码
# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
# 若待组合的数组都是三维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
#	2: 深度方向组合
np.concatenate((a, b), axis=0)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
np.split(c, 2, axis=0)

简单案例

长度不等的数组进行组合

python 复制代码
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
# 填充b数组使其长度与a相同,头部添加0个元素,尾部添加1个元素
b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1)
print(b)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print(c)

简单的一维数组组合方案

python 复制代码
a = np.arange(1,9)		#[1, 2, 3, 4, 5, 6, 7, 8]
b = np.arange(9,17)		#[9,10,11,12,13,14,15,16]
#把两个数组摞在一起成两行
c = np.row_stack((a, b))
print(c)
#把两个数组组合在一起成两列
d = np.column_stack((a, b))
print(d)
相关推荐
大千AI助手25 分钟前
指数分布:从理论到机器学习应用
人工智能·机器学习·参数估计·概率密度函数·mle·指数分布·累积分布函数
MATLAB代码顾问28 分钟前
MATLAB绘制多种混沌系统
人工智能·算法·matlab
搬砖的小码农_Sky29 分钟前
人形机器人:Tesla Optimus的AI集成细节
人工智能·ai·机器人
做运维的阿瑞40 分钟前
2025 年度国产大模型「开源 vs. 闭源」深度评测与实战指南
人工智能·低代码·开源
渡我白衣1 小时前
深度学习入门(三)——优化算法与实战技巧
人工智能·深度学习
可触的未来,发芽的智生1 小时前
触摸未来2025.10.10:记忆的种子,当神经网络拥有了临时工作区,小名喜忆记系统
人工智能·python·神经网络·机器学习·架构
极客BIM工作室1 小时前
演化搜索与群集智能:五种经典算法探秘
人工智能·算法·机器学习
Guheyunyi1 小时前
消防管理系统如何重构现代空间防御体系
大数据·运维·人工智能·安全·信息可视化·重构
东方芷兰1 小时前
LLM 笔记 —— 04 为什么语言模型用文字接龙,图片模型不用像素接龙呢?
人工智能·笔记·深度学习·语言模型·自然语言处理
Niuguangshuo2 小时前
深度学习基本模块:MultiheadAttention 多头注意力机制
人工智能·深度学习