三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)

文章目录

  • 5、其他创建数组的方式
    • 5.1 空数组
    • 5.2 全零数组
    • 5.3 全一数组
    • 5.4 数列
    • 5.5 随机数组
    • 5.6 数组转换
  • 6、索引、切片和迭代
  • 7、Numpy计算
    • 7.1 基本数组运算
    • 7.2 条件运算
    • 7.3 统计运算
  • 8、Numpy存取文件

前序内容:
三、机器学习基础知识:Python常用机器学习库(Numpy第一部分)

5、其他创建数组的方式

除了前面所述使用array函数构造数组外,还可以使用其他几种方式来构造特殊形式的数组。

5.1 空数组

Numpy的empty()函数可以创建一个指定形状、数据类型的空数组,该数组内容为空。创建的语法格式如下:

numpy.empty(shape,dtype=None,order=None)

其中shape表示数组形状;dtype表示数据类型,可选项;order有’C’和’F’两个选项,分别代表行优先和列优先,表示在计算机内存中存储元素的顺序,可选项。
创建一个空数组:

import numpy as np
x = np.empty([2,2],dtype = int)
print(x)

在这里插入图片描述

运行后得到的数组元素值是不确定的,因为所用空间未初始化。

5.2 全零数组

Numpy的zero()函数可以创建全部用0填充的数组。创建的语法格式如下:

numpy.zeros(shape,dtype=None,order=None)

其中shape表示数组形状;dtype表示数据类型,为可选项;order有’C’和’F’两个选项,分别代表行优先和列优先。
创建一个全零数组:

x = np.zeros([2,2],dtype = int)
print(x)

在这里插入图片描述

5.3 全一数组

Numpy的ones()函数可以创建全部用1填充的数组。创建的语法格式如下:

numpy.ones(shape,dtype=None,order=None)

其中shape表示数组形状;dtype表示数据类型,为可选项;order有’C’和’F’两个选项,分别代表行优先和列优先。
创建一个全一数组:

x = np.ones(2)
print(x)
y = np.ones([2,2],dtype = int)
print(y)

在这里插入图片描述

5.4 数列

如果需要创建一个包含简单数列的数组,可以使用Numpy中的arange()函数、linspace()函数。
arange()函数的功能和Python的range()函数功能类似,在start到stop的范围内,生成一个ndarray数组,其语法格式如下:

numpy.arange([start],stop[,step],dtype=None)

使用arange()函数创建包含序列的数组:

#生成1~5之间,步长为0.5的一维数组
arr1 = np.arange(1,5,0.5)
print(arr1)

在这里插入图片描述

linspace()函数与arange()函数的功能相似,也是在指定范围内生成均匀分布的数值序列,其语法格式如下:

numpy.linspace(start,stop,num,endpoint=True,dtype=None)

其中start,stop分别表示起始数和终止数,num表示元素个数,endpoint决定终止值是否包含在创建的数组中,dtype表示数据类型,后三个参数均为可选项。
使用linspace()函数创建包含序列的数组:

#生成1~5之间,元素总数为10的一维数组
arr2 = np.linspace(1,5,10)
print(arr2)

在这里插入图片描述

5.5 随机数组

在Numpy的random模块中还提供了随机函数用于随机数组的创建,常见的随机函数如下:

函数 作用
rand() 随机产生指定维度的0到1之间的浮点数组
randiant(low,high,size) 随机生成[low,high]之间的整数数组,大小为size
random(size) 随机生成[0,1)之间的浮点数数组,大小为size
uniform(start.end,size) 随机生成[start,end)之间均匀分布的浮点数数组,大小为size
normal(loc,scale,size) 随机生成符合均值为loc,方差为scale的正态分布下的浮点数组,大小为size

创建随机数组:

arr1 = np.random.rand(2,2) #随机产生形状为(2,2)的0到1之间的浮点数组
arr2 = np.random.randint(0,5,(2,2)) #随机生成[0,5]之间的整数数组,大小为(2,2)
arr3 = np.random.random((2,3)) #随机生成[0,1)之间的浮点数数组,大小为(2,3)
arr4 = np.random.uniform(0,5,(2,2)) #随机生成[0,5)之间均匀分布的浮点数数组,大小为(2,2)
arr5 = np.random.normal(1,1,(2,2))  #随机生成符合均值为1,方差为1的正态分布下的浮点数组,大小为(2,2)
print("生成的arr1:\n",arr1)
print("生成的arr2:\n",arr2)
print("生成的arr3:\n",arr3)
print("生成的arr4:\n",arr4)
print("生成的arr5:\n",arr5)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第1张图片

5.6 数组转换

Numpy中的array()函数可以将常见的数值序列,如List和Tuple转换为ndarray数组。
转换实例:

data1 = [1,2,3,4,5]
data2 = (1,2,3,4,5)
print(type(data1))
print(type(data2))
arr1 = np.array(data1) #list转换为array
arr2 = np.array(data2) #tuple换为array
print(type(arr1))
print(type(arr2))

在这里插入图片描述

6、索引、切片和迭代

切片是指取数据序列对象的一部分的操作,前面介绍过字符串、列表、元组都支持切片语法。ndarray数组与其他数据序列类似,也可以通过对数据位置下标进行索引,从而实现切片和迭代。
对ndarray进行切片操作与一维数组相同,用索引标记切片的起始和终止位置即可。因为ndarray可以是多维数组,在进行切片时,通常需要设定每个维度上的切片位置。
对数组进行切片操作:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print("arr1:\n",arr1)
arr2 = arr1[1:,2:] #截取第2行到最后1行,第3列到最后1列的元素生成一个新数组
print("arr2:\n",arr2)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第2张图片

NumPy还提供了一个copy()方法,可以根据现有的ndarray数组来创建新的ndarray数组。使用 copy()方法与切片可以用原数组的一部分生成新数组。
copy()方法的使用:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print("arr1:\n",arr1)
arr2 = np.copy(arr1[1:,0:3]) #切片复制arr1的第2行到最后1行,第1列到第3列的元素生成一个新数组
print("arr2:\n",arr2)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第3张图片

与其他数据序列类似,ndarray 也可以通过 for 循环实现迭代。当维数多于一维时,迭代操作使用嵌套的for循环。选代时,通常按照第一条轴(默认为行)对二维数组进行扫描。如果需要按其他维度迭代,可以使用apply_along_axis(func,axis,arr)函数指定当前处理的轴。
嵌套的for 循环进行数组迭代遍历:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
for x in arr1: #依次对行进行遍历
    for y in x:  #依次对列进行遍历
        print(y,end = ' ')

在这里插入图片描述

此外,NumPy还包含一个循环迭代器类numpy.nditer,所生成的迭代器(Iterator)对象是一个根据位置进行遍历的对象。这是一个有效的多维迭代器对象,与Python内置的iter()函数类似,每个数组元素可使用选代器对象来访问,即逐个访问数组中的元素。该方法迭代的顺序与数组的内容布局相匹配,不受数据排序的影响,哪怕对数组进行装置操作,虽然数据的显示顺序发生了变化,但是不影响迭代的顺序。
nditer对象进行数组迭代遍历:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print(arr1)
for x in np.nditer(arr1):
    print(x,end = ' ')
arr2 = arr1.T #对arr1进行装置
print("\n",arr2)
for x in np.nditer(arr2):
    print(x,end = ' ')

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第4张图片

如果需要特定的顺序,可以使用显示参数来强制nditer对象使用某种顺序,nditer对象提供了一个order参数来控制迭代顺序。其参数order有三个可选参数:K,C,F,K为默认方式逐个读取,C为行序优先,F为列序优先。
访问顺序的调整:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print(arr1)
print("行优先遍历的顺序")
for x in np.nditer(arr1,order = 'C'):
    print(x,end = ' ')
print("\n列优先遍历的顺序")
for x in np.nditer(arr1,order = 'F'):
    print(x,end = ' ')

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第5张图片

7、Numpy计算

Numpy中的ndarray可以直接进行基本运算,包括基本数组运算、条件运算以及统计运算。

7.1 基本数组运算

基本数组运算主要是指两个形状一致或“形状兼容”的数组之间可以进行加减乘除的计算过程。
相同形状的数组运算:

arr1 = arr2 = np.ones((2,3),dtype = int)
print(arr1+arr2) #求和
print(arr1-arr2) #求差
print(arr1*arr2) #求积
print(arr1/arr2) #求商

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第6张图片

形状兼容的数组运算:

arr3 = np.ones((2,3),dtype = int)
print(arr3)
arr4 = np.arange(3)
print(arr4)
print(arr3+arr4) #求和

在这里插入图片描述

上述代码中arr4会对arr3进行广播计算,即arr4数组会对arr3数组中的每一行都做加法运算,而进行这种广播计算的前提是arr4的形状和arr3的形状要兼容,如arr4的形状是23,arr3的形状是13,它们在列方向上是一致的。
此外数组和普通数值之间也可以进行运算,它们之间执行广播运算,也就是普通值会与数组的每个元素进行相应的运算。
数组与普通数值的运算:

arr5 = np.ones((2,3),dtype = int)
print(arr5+1)
print(arr5*3)

在这里插入图片描述

7.2 条件运算

Numpy中基本的条件运算主要是指进行大小的比较,若比较的条件为真,返回True,否则返回False。
简单条件运算:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print(arr1)
arr2 = [arr1>5]  #arr1中的元素大于5返回True,否则返回False
print(arr2)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第7张图片

另外可以使用where()函数实现查找筛选操作,其语法格式如下:

where(condition,x if true,y if false)

该语句根据condition的结果对数组的每个元素进行比较,之后返回特定数组,当条件为真时,返回x,条件为假时返回y。
where()函数的使用:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print(arr1)
arr2 = np.where(arr1>5,1,0) #arr1中的元素大于5返回1,否则返回0
print(arr2)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第8张图片

7.3 统计运算

常见的统计运算函数如下:

函数 作用
argmax() 获取最大值索引
argmin() 获取最小值索引
cumsum() 从第一个元素开始进行累加各元素并返回每个累加结果
max() 求最大值
min() 求最小值
mean() 求算术平均值
std() 求数组元素在给定轴上的标准偏差
sum() 求和

统计运算实例:

arr1 = np.arange(12).reshape(3,4) #生成取值为0~11,形状为(3,4)的数组
print("原始数组为:\n",arr1)
r1 = np.argmax(arr1) #求最大值索引
print("最大值索引为:",r1) 
r2 = np.argmin(arr1) #求最小值索引
print("最小值索引为:",r2)
r3 = np.cumsum(arr1) #求第一个元素开始的累加值并返回
print("元素累加值为:",r3)
r4 = np.max(arr1,axis=0) #求每列的最大值
print("每列最大值为:",r4)
r5 = np.mean(arr1,axis=0) #求每列的平均值
print("每列平均值为:",r5)
r6 = np.min(arr1,axis=1) #求每行的最小值
print("每行最小值为:",r6)
r7 = np.std(arr1,axis=1) #求每行的标准差
print("每行标准差为:",r7)
r8 = np.sum(arr1) #求和
print("元素之和为:",r8)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第9张图片

8、Numpy存取文件

Numpy提供了如下表所示的三种文件读写函数。

读函数 写函数 作用
fromfile() tofile() 存取二进制格式文件
load() save() 存取Numpy专用的二进制格式文件
loadtxt() savetxt() 存取文本文件,也可以访问CSV文件

上述三种方法中,最常用的是第三种函数方法,即loadtxt()和savetxt(),它们在存取过程中,使用的是Numpy内置的一维和二维数组格式。它们的语法格式如下:

np.loadtxt(fname, dtype=,  delimiter=None)
np.savetxt(fname, X, fmt= '%.18e', delimiter='')

参数释义:
fname:文件、字符串或产生器,可以是.gz或.bz2压缩文件。
X:准备存储到文件中的数据,一维或二维数组形式。
dtype:数据类型,可选。
fmt:格式字符串,缺省时为’%.18e’。
delimiter: 分隔字符串,默认是空格。
使用loadtxt()和savetxt()进行文件操作:

data = np.arange(0,50,5)
print(data)
np.savetxt('data.txt',data,delimiter=',')
data2 = np.loadtxt('data.txt',dtype=np.str_)
print(data2)

三、机器学习基础知识:Python常用机器学习库(Numpy第二部分)_第10张图片

你可能感兴趣的:(机器学习(Python),机器学习,人工智能,python,numpy,数据分析)