Python机器学习库(numpy库)

Python机器学习库(numpy库)

1. 数据的维度

一个数据表达一个含义,而一组数据表达一个或多个含义。

维度:是一组数据的组织形式

一维数据:由对等关系的有序或无序数据构成,采用线性方式组织,对应列表、数组和集合等概念。

列表:数据类型可以不同
数组:数据类型相同

二维数据:由多个一维数据构成,是一维数据的组合形式。

表格是典型的二维数据,其中,表头是二维数据的一部分

多维数据:由一维或二维数据在新维度上扩展形成。

数据维度的Python表示:

  1. 一维数据:列表和集合类型
  2. 二维数据:列表类型
  3. 多维数据:列表类型
  4. 高维数据:字典类型或其它如JSON、XML和YAML格式

2. numpy基础知识

2.1 numpy概述

numpy是开源的Python科学计算基础库,包含:

  • 强大的N维数组对象ndarray(Array; Matrix)
  • 成熟的(广播)函数库
  • 整合了C/C++/Fortran代码的工具
  • 实用的线性代数、傅里叶变换和随机数生成函数
  • 与稀疏矩阵运算包scipy配合使用更加方便

2.1 numpy概述

numpy是开源的Python科学计算基础库,包含:

  • 强大的N维数组对象ndarray(Array; Matrix)
  • 成熟的(广播)函数库
  • 整合了C/C++/Fortran代码的工具
  • 实用的线性代数、傅里叶变换和随机数生成函数
  • 与稀疏矩阵运算包scipy配合使用更加方便

2.1 numpy概述

numpy是开源的Python科学计算基础库,包含:

  • 强大的N维数组对象ndarray(Array; Matrix)
  • 成熟的(广播)函数库
  • 整合了C/C++/Fortran代码的工具
  • 实用的线性代数、傅里叶变换和随机数生成函数
  • 与稀疏矩阵运算包scipy配合使用更加方便
    在这里插入图片描述
    numpy是SciPy、Pandas等数据处理或科学计算库的基础。它提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库,为进行严格的数字处理而产生。很多大型金融公司,以及核心的科学计算组织如:Lawrence Livermore,NASA都在用其处理一些本来使用C++,Fortran或Matlab等所做的任务。

2.2 numpy库的引用

Anaconda里面已经安装过numpy。

原生Python安装

在控制台中输入:
pip install numpy

安装之后可以导入

import numpy as np
#尽管别名可以省略或更改,但建议使用以上约定俗成的别名“np“

3. ndarray数组的创建

3.1 N维数组对象ndarray

Python已有列表类型,为什么需要一个数组对象(类型)?

标准Python中用list(列表)保存值,可以当做数组使用,但因为列表中的元素可以是任何对象,所以浪费了CPU运算时间和内存。

numpy诞生为了弥补这些缺陷。它提供了两种基本的对象:

  • ndarray:全称(n-dimensional array object)是储存单一数据类型的多维数组。
  • ufunc:全称(universal function object)它是一种能够对数组进行处理的函数。

numpy中文官网

A和B是一维数组,计算A2+B3,示例如下:

# python基础语法方式
def pySum():
    a=[0,1,2,3,4]
    b=[5,6,7,8,9]
    c=[]
    for i in range(len(a)):
        c.append(a[i]+b[i])
    return c
print(pySum())

[5, 7, 9, 11, 13]

# numpy库方式
def npSum():
    a=np.array([0,1,2,3,4])
    b=np.array([5,6,7,8,9])
    return a+b
print(npSum())

[ 5 7 9 11 13]
N维数组对象:ndarray

ndarray是一个多维数组对象,由两部分构成:

  • 实际的数据
  • 描述这些数据的元数据(数据维度、数据类型等)

numpy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型(同质)元素的多维数组。
在这里插入图片描述
ndarray对维数没有限制。
小括号从左到右分别为第0轴,第1轴,第2轴,第3轴。

3.2 创建ndarray数组

ndarray数组的创建方法:

  • 使用Python列表、元组创建ndarray数组
  • 使用numpy函数创建ndarray数组
  • 3.2.1 使用Python列表、元组创建ndarray数组
x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)

当np.array()不指定dtype时,numpy将根据数据情况关联一个dtype类型

一维ndarray

import numpy as np
# 一维array
a = np.array([2,23,4], dtype=np.int32) # np.int默认为int32
print(a)
print(a.dtype)

[ 2 23 4]
int32

多维ndarray

# 多维array
a = np.array([[2,3,4],
              [3,4,5]])
print(a) # 生成2行3列的矩阵

[[2 3 4]
[3 4 5]]

c = np.array([(1,2,3),
            [4,5,6],
            (7,8,9)],dtype=np.float32)
c,c.dtype

(array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]], dtype=float32),
dtype(‘float32’))

3.2.2 使用numpy函数创建ndarray数组
函数说明
np.arange(n)类似range()函数,返回ndarray类型,元素从0到n‐1
np.ones(shape)根据shape生成一个全1数组,shape是元组类型
np.zeros(shape)根据shape生成一个全0数组,shape是元组类型
np.full(shape,val)根据shape生成一个数组,每个元素值都是val
np.linspace()根据起止数据等间距地填充数据,形成数组
np.empty(shape))创建全空数组每个值都是接近于零的数
np.eye(n)创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a)根据数组a的形状生成一个全1数组
np.zeros_like(a)根据数组a的形状生成一个全0数组
np.full_like(a,val)根据数组a的形状生成一个数组,每个元素值都是val
np.concatenate()将两个或多个数组合并成一个新的数组

创建连续数组

# 创建连续数组
a = np.arange(10,41,2) # 10-20的数据,步长为2
print(a)

[10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40]

创建全1数据

# 创建全一数据,同时指定数据类型
a = np.ones((3,4),dtype=np.int32)
print(a)

[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
创建全零数组

a = np.zeros((3,4))
print(a) # 生成3行4列的全零矩阵

[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]

创建全特定数值ndarray数组

a=np.full((3,4,5),10)
a.shape,a

((3, 4, 5),
array([[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]],

[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]],

[[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10],
[10, 10, 10, 10, 10]]]))

根据起止数据创建等间距序列数据

# 创建线段型数据
a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段
print(a)

[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105
3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632
6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158
9.52631579 10. ]

创建全空数组

# 创建全空数组,其实每个值都是接近于零的数
a = np.empty((3,4))
print(a)

[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]

#将列表转换为矩阵
a=np.eye(5)
print(a)

[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]

3.3 ndarray数组的属性

属性说明
.ndim秩,即轴的数量或维度的数量
.shapendarray数组的尺度,对于矩阵,n行m列
.sizendarray数组元素的个数,相当于.shape中n*m的值
.dtypendarray数组的元素类型
.itemsizendarray数组中每个元素的大小,以字节为单位

秩、维度、轴的数量

a=np.full((3,4,5),1.,dtype=np.float32)
print(a)
print('number of dim:', a.ndim)

[[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]

[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]

[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]]
number of dim: 3

数组的尺度、行数、列数…

print('shape:',a.shape)

shape: (3, 4, 5)

元素个数

print('size:',a.size)

size: 60

元素类型

print('type:',a.dtype)

type: float32

查看每个元素所占空间的大小,以字节为单位

print('size:',a.itemsize)

size: 4

3.4 ndarray数组的元素类型

数据类型说明
bool布尔类型,True或False
intc与C语言中的int类型一致,一般是int32或int64
intp用于索引的整数,与C语言中size_t一致,int32或int64
int8字节长度的整数,取值:[‐128,127]
int1616位长度的整数,取值:[‐32768,32767]
int3232位长度的整数,取值:[‐231,231‐1]
int6464位长度的整数,取值:[‐263,263‐1]
uint88位无符号整数,取值:[0,255]
uint1616位无符号整数,取值:[0,65535]
uint3232位无符号整数,取值:[0,232‐1]
uint6432位无符号整数,取值:[0,264‐1]
float1616位半精度浮点数:1位符号位,5位指数,10位尾数
float3232位半精度浮点数:1位符号位,8位指数,23位尾数
float6464位半精度浮点数:1位符号位,11位指数,52位尾数
complex64复数类型,实部和虚部都是32位浮点数
complex128复数类型,实部和虚部都是64位浮点数

Python语法仅支持整数、浮点数和复数3种类型,而ndarray为什么要支持这么多种元素类型?

  • 科学计算涉及数据较多,对存储和性能都有较高要求
  • 对元素类型精细定义,有助于numpy合理使用存储空间并优化性能
  • 对元素类型精细定义,有助于程序员对程序规模有合理评估

ndarray数组可以由非同质对象构成,非同质ndarray元素为对象类型,非同质ndarray数组无法有效发挥numpy优势,尽量避免使用。

x=np.array([[0,1,2,3,4],
          [5,6,7,8]],dtype=object)
x.dtype

dtype(‘O’)

dtype(‘O’)显示ndarray数组x中的每个元素是非同质对象类型。

x=np.array([[0,1,2,3,4],
          [5,6,7,8,9]],dtype=object)
x.dtype

dtype(‘O’)

3.5 ndarray数组的变换

对于创建后的ndarray数组,可以对其进行维度变换和元素类型变换。

方法说明
.reshape(shape)不改变数组元素,返回一个shape形状的数组,原数组不变
.resize(shape)与.reshape()功能一致,但修改原数组
.swapaxes(ax1,ax2)将数组n个维度中两个维度进行调换
.flatten()对数组进行降维,返回折叠后的一维数组,原数组不变
.astype()对数组进行类型变换
.tolist()将数据类型转换为列表

reshape操作

a = [ i for i in range(24)]
a=np.array(a)
print(a)
# 使用reshape改变上述数据的形状
b = a.reshape((4,6))
print(b)

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]

b.resize((2,3,4))
b

array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],

[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])

c = b.swapaxes(0,1)
print(c, c.shape)

[[[ 0 1 2 3]
[12 13 14 15]]

[[ 4 5 6 7]
[16 17 18 19]]

[[ 8 9 10 11]
[20 21 22 23]]] (3, 2, 4)

c=b.flatten()
c

array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23])

ndarray数组的类型变换
new_a = a.astype(new_type)

a=np.ones((2,3,4),dtype=np.int32)
a
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

命运从未公平

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

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

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

打赏作者

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

抵扣说明:

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

余额充值