numpy 模块内容基于jupyter notebook而来,In [*]以下内容为代码,Out[*]为输出结果;
由于执行顺序不一样,可能会有些数据上下文衔接不上,重点是使用方法。NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。
In [3]:
import numpy as np
# 使用array()来创建一个一维数组
arr = np.array([1,2,3,4,5])
arr
Out[3]:
array([1, 2, 3, 4, 5])
In [6]:
# 使用array()来创建一个多维数组
np.array([[1,2,3,4,5],[6,7,8,9,10]])
Out[6]:
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
数组中存储的数据元素类型必须是统一类型
优先级:字符串 > 浮点型 > 整数
In [7]:
np.array([[1,2,3],[4.1,5,6]])
Out[7]:
array([[1. , 2. , 3. ],
[4.1, 5. , 6. ]])
用numpy的routines函数来创建数组:zeros(),ones(),linespace(),arange(),random
In [35]:
np.zeros(5)
Out[35]:
array([0., 0., 0., 0., 0.])
In [36]:
np.ones(shape=(2,3))
Out[36]:
array([[1., 1., 1.],
[1., 1., 1.]])
In [38]:
np.linspace(0,20,num=4)
Out[38]:
array([ 0. , 6.66666667, 13.33333333, 20. ])
In [39]:
np.arange(0,20,step=2)
Out[39]:
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
In [42]:
# 随机
np.random.randint(0,20,size=(2,3))
Out[42]:
array([[ 7, 19, 17],
[ 8, 3, 14]])
In [46]:
# 固定随机性
# np.random.seed()的作用: 当设置相同的seed时,每次生成的随机数也相同,如果不设置seed,则每次生成的随机数都会不一样
np.random.seed(23)
np.random.randint(0,20,size=(2,3))
Out[46]:
array([[19, 6, 8],
[ 9, 8, 13]])
In [47]:
arr.shape # 形状
Out[47]:
(2, 5)
In [48]:
arr.ndim #维度
Out[48]:
2
In [49]:
arr.size # 返回元素个数
Out[49]:
10
In [53]:
type(arr)
Out[53]:
numpy.ndarray
In [50]:
arr.dtype # 数组元素类型
Out[50]:
dtype('int32')
array(dtype=?):可以设定数据类型
arr.dtype = '?':可以修改数据类型
In [114]:
arr = np.random.randint(0,100,size=(5,7))
arr
Out[114]:
array([[34, 0, 91, 11, 62, 96, 88],
[54, 89, 78, 41, 70, 85, 5],
[ 7, 4, 16, 9, 56, 48, 43],
[62, 70, 31, 2, 0, 15, 32],
[48, 15, 61, 2, 34, 22, 42]])
In [115]:
# 取第2行的数据,下标从0开始计算
arr[2]
Out[115]:
array([ 7, 4, 16, 9, 56, 48, 43])
In [119]:
# 取不连续的多行数据
arr[[1,3,4]]
Out[119]:
array([[54, 89, 78, 41, 70, 85, 5],
[62, 70, 31, 2, 0, 15, 32],
[48, 15, 61, 2, 34, 22, 42]])
In [131]:
# 取某个值
arr[0,4]
Out[131]:
62
In [122]:
# 取不连续的某个值: 取的是(0,1)和(3,2)的2个值
arr[[0,3],[1,2]]
Out[122]:
array([ 0, 31])
In [130]:
# 取第一行,第2到第3列 交叉处的数据
arr[0:1, 1:3]
Out[130]:
array([[ 0, 91]])
In [132]:
# 比较数组小于20,对每个元素比较,返回True/False
arr<20
Out[132]:
array([[False, True, False, True, False, False, False],
[False, False, False, False, False, False, True],
[ True, True, True, True, False, False, False],
[False, False, False, True, True, True, False],
[False, True, False, True, False, False, False]])
In [135]:
# 把所有小于20的值都赋值为10
arr[arr<20]=10
arr
Out[135]:
array([[34, 10, 91, 10, 62, 96, 88],
[54, 89, 78, 41, 70, 85, 10],
[10, 10, 10, 10, 56, 48, 43],
[62, 70, 31, 10, 10, 10, 32],
[48, 10, 61, 10, 34, 22, 42]])
In [136]:
# numpy中的三元运算符,小于20的都赋值为0,否则赋值为20
np.where(arr<20, 0, 20)
Out[136]:
array([[20, 0, 20, 0, 20, 20, 20],
[20, 20, 20, 20, 20, 20, 0],
[ 0, 0, 0, 0, 20, 20, 20],
[20, 20, 20, 0, 0, 0, 20],
[20, 0, 20, 0, 20, 20, 20]])
In [139]:
# clip(a,b)把小于a的替换为a,大于b的替换为b
arr.clip(20,90)
Out[139]:
array([[34, 20, 90, 20, 62, 90, 88],
[54, 89, 78, 41, 70, 85, 20],
[20, 20, 20, 20, 56, 48, 43],
[62, 70, 31, 20, 20, 20, 32],
[48, 20, 61, 20, 34, 22, 42]])
In [141]:
# 2个nan是不相等的
print(np.nan == np.nan)
print(np.nan != np.nan)
Out [141]:
False
True
In [147]:
# 使用count_nonzero(arr!=arr)来判断nan的个数
arr = np.array([1.,2.,np.nan,np.nan])
np.count_nonzero(arr!=arr)
Out[147]:
2
In [150]:
# 使用isnan来判断是否为nan
print(np.isnan(arr))
# 把nan赋值为0
arr[np.isnan(arr)] = 0
arr
# nan和任何值计算都是nan
Out[150]:
[False False False False]
array([1., 2., 0., 0.])
In [161]:
a1 = np.random.randint(0,100,size=(2,5))
print(a1)
a2 = np.random.randint(0,100,size=(2,5))
print(a2)
Out [161]:
[[93 21 96 60 67]
[99 60 9 13 81]]
[[35 6 62 71 41]
[47 41 88 52 97]]
In [162]:
# 数组的拼接: 2个数组的shape是一样的才能拼接
# np.vstack((a1, a2)) 竖直拼接
print(np.vstack((a1,a2)))
# np.hstack((a1,a2)) 水平拼接
print(np.hstack((a1,a2)))
Out [162]:
[[93 21 96 60 67]
[99 60 9 13 81]
[35 6 62 71 41]
[47 41 88 52 97]]
[[93 21 96 60 67 35 6 62 71 41]
[99 60 9 13 81 47 41 88 52 97]]
In [57]:
# 切片: 切出数组的前2行
arr[0:2]
Out[57]:
array([[76, 91, 39, 90, 25, 51, 6],
[45, 12, 49, 66, 75, 85, 69]])
In [58]:
# 切片: 切出数组的前2列
arr[:,0:2]
Out[58]:
array([[76, 91],
[45, 12],
[64, 12],
[62, 57],
[36, 65]])
In [59]:
# 切片:切出前两行的前两列
arr[0:2,0:2]
Out[59]:
array([[76, 91],
[45, 12]])
In [64]:
# 每行数据倒序
arr[:,::-1]
Out[64]:
array([[ 6, 51, 25, 90, 39, 91, 76],
[69, 85, 75, 66, 49, 12, 45],
[90, 79, 41, 48, 21, 12, 64],
[15, 39, 59, 33, 19, 57, 62],
[83, 86, 15, 43, 1, 65, 36]])
In [65]:
# 每列数据倒序
arr[::-1]
Out[65]:
array([[36, 65, 1, 43, 15, 86, 83],
[62, 57, 19, 33, 59, 39, 15],
[64, 12, 21, 48, 41, 79, 90],
[45, 12, 49, 66, 75, 85, 69],
[76, 91, 39, 90, 25, 51, 6]])
In [66]:
# 数据翻转
arr[::-1,::-1]
Out[66]:
array([[83, 86, 15, 43, 1, 65, 36],
[15, 39, 59, 33, 19, 57, 62],
[90, 79, 41, 48, 21, 12, 64],
[69, 85, 75, 66, 49, 12, 45],
[ 6, 51, 25, 90, 39, 91, 76]])
In [78]:
# 转置矩阵,行列互换
arr.T
Out[78]:
array([[76, 45, 64, 62, 36],
[91, 12, 12, 57, 65],
[39, 49, 21, 19, 1],
[90, 66, 48, 33, 43],
[25, 75, 41, 59, 15],
[51, 85, 79, 39, 86],
[ 6, 69, 90, 15, 83]])
In [79]:
arr = np.random.randint(0,100,size=(3,4))
arr
Out[79]:
array([[29, 42, 38, 4],
[93, 32, 50, 85],
[27, 33, 91, 95]])
In [72]:
# 将多维数组变成一维数组
arr_1 = arr.reshape((12,))
arr_1
Out[72]:
array([ 1, 41, 26, 37, 41, 56, 39, 81, 32, 53, 35, 23])
In [112]:
# 用flatten将多维数组变成一维数组
arr.flatten()
Out[112]:
array([29, 42, 38, 4, 93, 32, 50, 85, 27, 33, 91, 95])
In [73]:
# 1维变2维
arr_1.reshape((2,6))
Out[73]:
array([[ 1, 41, 26, 37, 41, 56],
[39, 81, 32, 53, 35, 23]])
In [80]:
# 级联操作 - 将多个numpy数组进行横向或者纵向的拼接
np.concatenate((arr,arr),axis=0) # axis=0表示列方向
Out[80]:
array([[29, 42, 38, 4],
[93, 32, 50, 85],
[27, 33, 91, 95],
[29, 42, 38, 4],
[93, 32, 50, 85],
[27, 33, 91, 95]])
In [81]:
np.concatenate((arr,arr),axis=1) # axis=1表示行方向
Out[81]:
array([[29, 42, 38, 4, 29, 42, 38, 4],
[93, 32, 50, 85, 93, 32, 50, 85],
[27, 33, 91, 95, 27, 33, 91, 95]])
In [82]:
# 聚合操作 sum
arr.sum(axis=1)
Out[82]:
array([113, 260, 246])
In [85]:
# max
arr.max(axis=0)
Out[85]:
array([93, 42, 91, 95])
In [86]:
# min
arr.min(axis=1)
Out[86]:
array([ 4, 32, 27])
In [87]:
# mean
arr.mean(axis=0)
Out[87]:
array([49.66666667, 35.66666667, 59.66666667, 61.33333333])
In [88]:
# 数学函数 sin(),cos(),tan()
np.sin(arr)
Out[88]:
array([[-0.66363388, -0.91652155, 0.29636858, -0.7568025 ],
[-0.94828214, 0.55142668, -0.26237485, -0.17607562],
[ 0.95637593, 0.99991186, 0.10598751, 0.68326171]])
In [92]:
# numpy.around(a,decimals) 函数返回指定数字的四舍五入值
# a: 数组
# decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
np.around(arr,decimals=-1)
Out[92]:
array([[ 30, 40, 40, 0],
[ 90, 30, 50, 80],
[ 30, 30, 90, 100]])
常用的统计函数
numpy.amin() 和 numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。
numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)。
numpy.median() 函数用于计算数组 a 中元素的中位数(中值)
标准差std():标准差是一组数据平均值分散程度的一种度量。
公式:std = sqrt(mean((x - x.mean())**2))
如果数组是 [1,2,3,4],则其平均值为 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,结果为 1.1180339887498949。
方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。
In [101]:
a = np.array([22,33,22,34,41,45])
np.amin(a)
Out[101]:
22
In [102]:
np.amax(a)
Out[102]:
45
In [104]:
np.ptp(a)
Out[104]:
23
In [106]:
a = np.array([1,2,3,4])
a.std()
Out[106]:
1.118033988749895
In [107]:
a.var()
Out[107]:
1.25
矩阵相乘
numpy.dot(a, b, out=None)
a : ndarray 数组
b : ndarray 数组
第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。
a1 = np.array([[2,1],[4,3]])
a2 = np.array([[1,2],[1,0]])
np.dot(a1,a2)
Out[108]:
array([[3, 4],
[7, 8]])
将外部的一张图片读取加载到numpy数组中
import matplotlib.pyplot as plt
# 将图片数据进行读取,返回的是一个三维数组, 需安装pillow组件
img_arr = plt.imread('./hold.jpg')
# 讲数组中的数据进行图像显示
plt.imshow(img_arr)
# 将数组中的每一个数组元素都减去100
plt.imshow(img_arr-100)
# 将图片进行左右翻转
plt.imshow(img_arr[:,::-1,:])
# 将图片上下翻转
plt.imshow(img_arr[::-1,:,:])
Out[15]:
# 将图片中“心”字裁剪出来
plt.imshow(img_arr[260:360,250:480,:]) # 裁剪时,第一个对应y轴,第二个对应x轴,
# 实现图片的九宫格
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1) # axis=1 表示行
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0) # axis=0 表示列
plt.imshow(arr_9)