除了前面所述使用array函数构造数组外,还可以使用其他几种方式来构造特殊形式的数组。
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)
运行后得到的数组元素值是不确定的,因为所用空间未初始化。
Numpy的zero()函数可以创建全部用0填充的数组。创建的语法格式如下:
numpy.zeros(shape,dtype=None,order=None)
其中shape表示数组形状;dtype表示数据类型,为可选项;order有’C’和’F’两个选项,分别代表行优先和列优先。
创建一个全零数组:
x = np.zeros([2,2],dtype = int)
print(x)
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)
如果需要创建一个包含简单数列的数组,可以使用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)
在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)
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))
切片是指取数据序列对象的一部分的操作,前面介绍过字符串、列表、元组都支持切片语法。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)
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)
与其他数据序列类似,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 = ' ')
如果需要特定的顺序,可以使用显示参数来强制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 = ' ')
Numpy中的ndarray可以直接进行基本运算,包括基本数组运算、条件运算以及统计运算。
基本数组运算主要是指两个形状一致或“形状兼容”的数组之间可以进行加减乘除的计算过程。
相同形状的数组运算:
arr1 = arr2 = np.ones((2,3),dtype = int)
print(arr1+arr2) #求和
print(arr1-arr2) #求差
print(arr1*arr2) #求积
print(arr1/arr2) #求商
形状兼容的数组运算:
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)
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)
另外可以使用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)
常见的统计运算函数如下:
函数 | 作用 |
---|---|
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)
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)