二、数组的存储和处理——NumPy模块
2.1 创建数组
多维数组
array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
import numpy as np
a = np.array([1,2,3,4])
b = np.array([[1,2,3], [4,5,6],[7,8,9]])
print(a)
print(b)
运行结果:
[1 2 3 4]
[[1 2 3]
[4 5 6]
[7 8 9]]
等差数组
arange(start,stop,step,dtype=None)
import numpy as np
d = np.arange(1,20,4)
e = np.arange(1,5)
print(d) #[1,5,9,13,17]
print(e) #[0,1,2,3,4]
随机数组
rand()函数创构建的数组中每一个元素都是[0,1)区间内的随机数。
import numpy as np
f = np.random.rand(3)
g = np.random.rand(2,3)
print(f)
print(g)
运行结果:
[0.91281291 0.69903541 0.72866193]
[[0.62584457 0.966894 0.85643789]
[0.18110455 0.83990563 0.20623303]]
randn()函数创建的数组中的元素时符合标准正态分布(均值为0,标准差为1)的随机数
import numpy as np
f = np.random.randn(3)
print(f)
randint()函数创建的数组中的元素是指定范围内的随机整数
import numpy as np
f = np.random.randint(1,5,10) #[1,5)区间
e = np.random.randint(1,5,(4,2))
print(f)
print(e)
运行结果:
[2 2 2 3 3 2 4 1 1 3]
[[4 1]
[1 4]
[2 4]
[3 1]]
2.2查看数组属性
import numpy as np
e = np.array([[4 1],[1 4],[3 1]])
print(arr.e) #(3,2)
print(arr.e[0]) #查看数组arr的行数:3
print(arr.e[1]) #查看数组arr的列数:2
print(arr.size) #查看数组arr的大小/元素个数:6
print(arr.dtype)#查看数组元素的数据类型:int32
arr1 = arr.astype(float) #数据类型转换
print(arr.ndim) #查看数组arr的维度:2
2.3选取数组元素
一维数组
import numpy as np
arr = np.array([12,2,3,4,8,6,34,27,11])
#选取单个元素
print(arr[0]) #12
print(arr[-1]) #11
#选取连续的元素
print(arr[1:6]) #[2 3 4 8 6]
print(arr[:-3]) #[12 2 3 4 8 6]
#选取不连续的元素
print(arr[1:7:2])#[2 4 6]
print(arr[:3:]) #[12 2 3]
二维数组
import numpy as np
arr = np.array([[12,2,3],[4,8,6],[34,27,11]])
#选取单个元素
print(arr[1,2]) #6
#选取单行或单列的元素
print(arr[2]) #[34 27 11]
print(arr[:,1]) #[ 2 8 27]
#选取某些行或某些列的元素
print(arr[1:3])
#[[ 4 8 6]
# [34 27 11]]
print(arr[:,2]) #[ 3 6 11]
#同时选取行列元素
print(arr[0:2, 1:3])
#[[2 3]
# [8 6]]
2.4数组的重塑于转置
一维数组的重塑
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8])
a = arr.reshape(2, 4)
print(a)
运行结果:
[[1 2 3 4]
[5 6 7 8]]
多维数组的重塑
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a = arr.reshape(4, 3)
print(a)
运行结果:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
多维为转换一维
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(arr.flatten())
print(arr.ravel())
运行结果:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
数组的转置
T属性
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(arr)
print(arr.T)
运行结果:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[ 1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]]
transpose()是通过调换数组的行和列的索引值来转置数组的。
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
arr1 = np.transpose(arr)
print(arr1)
运行结果:
[[ 1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]]
2.5数组的处理
添加数组元素
使用NumPy模块中的append()函数和insert()函数可以方便地在数组中添加元素
append()
append(arr, values, axis=None)
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
arr1 = np.append(arr,[[7,8,9]])
print(arr1)
代码运行结果如下:
[1 2 3 4 5 6 7 8 9]
从运行结果可以看出,使用append()函数在二维数组arr中添加元素后,返回的数组变成了一维数组。
如果想要在不改变数组维度的情况下在数组末尾添加元素,可以为append()函数添加数axis。
import numpy as np
arr=np.array([[1,2,3],[4,5,6]])
arr1=np.append(arr,[[7,8,9]],axis=0)
print(arr1)
#第3行代码中为append()函数设置参数axis的值0,我们可以简单地将其理解为,元素会添加在数组ar的行方向上,也就是说,数组的行数会增加,而列数不变。
代码运行结果如下:
[[1 2 3]
[4 5 6]
[7 8 9]]
import numpy as np
arr=np.array([[1,2,3],[4,5,6]])
arr1=np.append(arr,[[7,8],[9,10]],axis=1)
print(arr1)
#append()函数的参数axis也可以设置为1,表示元素会添加在数组的列方向上,也就是说,数组的列数会增加,而行数不变。
代码运行结果如下:
[[1 2 3 7 8]
[4 5 6 9 10]]
insert()函数
insert(arr, obj, values, axis=None)
insert()函数用于在数组的指定位置插入元素。
import numpy as np
arr=np.array([[1,2],[3,4],[5,6]])
arr1=np.insert(arr,1,[7,8])
print(arr1)
代码运行结果如下:
[1 7 8 2 3 4 5 6]
同上
import numpy as np
arr = np.array([[1,2],[3,4],[5,6]])
arr1=np.insert(arr,1,[7,8],axis=0)
arr2=np.insert(arr,1,[7,8,9],axis=1)
print(arr1)
print(arr2)
代码运行结果如下:
[[1 2]
[7 8]
[3 4]
[5 6]]
[[1 7 2]
[3 8 4]
[5 9 6]]
删除数组元素
import numpy as np
arr=np.array([[1,2,3],[4,5,6],[7,8,9]])
arr1=np.delete(arr,2)
arr2 = np.delete(arr,2,axis=0)
arr3 = np.delete(arr,2,axis=1)
print(arr1)
print(arr2)
print(arr3)
代码运行结果如下:
[1 2 4 5 6 7 8 9]
[[1 2 3]
[4 5 6]]
[[1 2]
[4 5]
[7 8]]
处理数组的重复值
NumPy模块中的unique()函数除了会去除数组中的重复元素,还会将去重后的数组元素从小到大排列。
import numpy as np
arr = np.array([8,4,2,3,5,2,5,5,6,8,8,9])
arr1=np.unique(arr)
arr1, arr2 = np. unique(arr, return_counts=True)
print(arr1)
print(arr2)
#第2行添加了一个参数 return counts,并设置参数值为True,用于查看去重后数组中的元素在原数组中出现的次数。为去重后的数组arrl中的每个元素在原数组arr中出现的次数,例如,数字2在数组arr中出现了2次,数字3在数组arr中出现了1次。
代码运行结果如下:
[2 3 4 5 6 8 9]
[2 1 1 3 1 3 1]
拼接数组
待合并的几个数组的维度必须相同。
如果合并的是一维数组,数组的形状可以不一样;但如果合并的是多维数组,则数组的形状必须相同,也就是数组的行列数必须一样。
concatenate()函数能一次合并多个数组,是数组拼接最常用的方法。
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]])
arr2=np.array([[7,8,9],[10,11,12]])
arr3=np.concatenate((arr1,arr2),axis=0)
arr4=np.concatenate((arr1,arr2),axis=1)
print(arr3)
print(arr4)
代码运行结果如下:
[[ 1 2 3]
[4 5 6]
[7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[4 5 6 10 11 12]]
hstack()函数能以水平堆叠的方式拼接数组。
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]])
arr2=np.array([[7,8,9],[10,11,12]])
arr3=np.hstack((arr1,arr2))
print(arr3)
代码运行结果如下:
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
#从运行结果可以看出,hstack()函数拼接数组的效果等同于concatenate()函数在行方向上拼接数组的效果。
vstack()函数能以垂直堆叠的方式拼接数组。
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]])
arr2=np.array([[7,8,9],[10,11,12]])
arr3=np.vstack((arr1,arr2))
print(arr3)
代码运行结果如下:
[[1 2 3]
[4 5 6]
[7 8 9]
[10 11 12]]
从运行结果可以看出,vstack()函数拼接数组的效果等同于concatenate()函数在列方向上拼接数组的效果。
拆分数组
#split()函数可以按指定的份数将一个数组均分为多个数组。
import numpy as np
arr=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
arr1=np.split(arr,2)
arr2=np.split(arr,4)
print(arr1)
print(arr2)
代码运行结果如下:
[array([1, 2, 3, 4, 5, 6]), array([ 7, 8, 9, 10, 11, 12])]
[array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9]), array([10, 11, 12])]
import numpy as np
arr=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
arr3=np.split(arr,[2,6])
arr4=np.split(arr,[2,3,8,10])
print(arr3)
print(arr4)
代码运行结果如下:
[array([1,2]),array([3,4,5,6]),array([7,8,9,10,11,12])]
[array([1,2]),array([3]),array([4,5,6,7,8]),array([9,10]),
array([11,12])]
#从运行结果可以看出,一维数组arr被分别拆分为3个一维数组和5个一维数组,拆分出的各个数组的大小并不相同。
hsplit()函数能将一个数组横向拆分为多个数组。vsplit()函数能将一个数组纵向拆分为多个数组
import numpy as np
arr=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
arr5 = np. hsplit (arr, 2)
arr6=np.vsplit(arr,2)
print(arr5)
print(arr6)
代码运行结果如下(第1~7行为将数组arr横向拆分成两个数组的效果,第8~10行为将数组arr纵向拆分成两个数组的效果):
[array([[ 1, 2],
[5,6],
[9,10],
[13,14]]),array([[3,4],
[7,8],
[11,12],
[15,16]])]
[array([[1, 2, 3, 4],
[5,6,7,8]]),array([[9,10,11,12],
[13,14,15,16]])]
2.6数组的运算
NumPy模块的优势不仅在于支持多个维度数据的存储和展示,它还能很好地支持数组的数学运算,如数组之间的四则运算和数组元素的统计运算。
数组之间的四则运算
对于多个形状一致的数组,我们可以直接对它们进行加、减、乘、除等运算,运算结果是一个由对应位置上的元素分别进行四则运算后的数组。
import numpy as np
arr=np.array([[1,2,3,4],[5,6,7,8]])
arr2=np.array([[9,10,11,12],[13,14,15,16]])
arr3 = arr+ arr2
arr4=arr*arr2
arr5=arr+5
arr6=arr*10
print(arr3)
print(arr4)
print(arr5)
print(arr6)
代码运行结果如下:
[[10 12 14 16]
[18 20 22 24]]
[[ 9 20 33 48]
[ 65 84 105 128]]
[[ 6 7 8 9]
[10 11 12 13]]
[[10 20 30 40]
[50 60 70 80]]
数组元素的统计运算
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
arr1 = arr.sum() #求和
arr2 = arr.sum(axis=0)
arr3 = arr.sum(axis=1)
arr4 = arr.mean () #求平均值
arr5 = arr.mean(axis=0)
arr6 = arr.mean(axis=1)
arr7 = arr.max () #求最值
arr8 = arr.max(axis=0)
arr9 = arr.max(axis=1)
print(arr1)
print(arr2)
print(arr3)
print(arr4)
print(arr5)
print(arr6)
print(arr7)
print(arr8)
print(arr9)
代码运行结果如下:
78
[15 18 21 24]
[10 26 42]
6.5
[5. 6. 7. 8.]
[ 2.5 6.5 10.5]
12
[ 9 10 11 12]
[ 4 8 12]