记录下numpy简单使用
#%%
# 导入numpy
import numpy as np
arr = np.array([1,2,3,4,5])
# array([1, 2, 3, 4, 5])
# 使用array创建一个多维数组
np.array([[1,2,3],[4,5,6]])
"""
array([[1, 2, 3],
[4, 5, 6]])
"""
np.array([[1,2,3],[4,'five',6]])
"""
array([['1', '2', '3'],
['4', 'five', '6']], dtype='<U11')
"""
# 从外部读取数据(图片)
import matplotlib.pyplot as plt
img_arr = plt.imread('./1.jpg')
img_arr
"""
array([[[ 46, 70, 72],
[ 39, 65, 64],
[ 39, 66, 61],
...,
[ 22, 47, 44],
[ 18, 43, 39],
[ 20, 45, 41]],
[[ 38, 64, 63],
[ 42, 68, 65],
[ 46, 73, 68],
...,
[ 23, 49, 46],
[ 16, 42, 39],
[ 17, 44, 39]],
[[ 42, 69, 64],
[ 46, 73, 66],
[ 48, 74, 65],
...,
[ 14, 40, 37],
[ 20, 46, 43],
[ 19, 46, 41]],
...,
[[112, 156, 131],
[117, 162, 119],
[126, 167, 109],
...,
[ 44, 83, 90],
[ 32, 66, 75],
[ 32, 65, 74]],
[[140, 187, 145],
[129, 172, 126],
[121, 159, 108],
...,
[ 34, 71, 79],
[ 33, 68, 74],
[ 33, 66, 73]],
[[127, 180, 128],
[115, 162, 118],
[ 87, 124, 90],
...,
[ 43, 80, 86],
[ 34, 69, 75],
[ 35, 68, 75]]], dtype=uint8)
"""
# 将一个三维的numpy数组显示成一张图片
# plt.imshow(img_arr)
# 对图片数据进行修改
# plt.imshow(img_arr-100)
# 系列方法
"""
zeros()
ones()
arange()
random系列
"""
# zeros()
np.zeros(shape=(3,4))
"""
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
"""
# ones()
np.ones(shape=(4,3))
"""
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
"""
# linspace() 一维等差数列
# 0,100规定数的范围,10 规定元素个数
np.linspace(0,100,num=10)
"""
array([ 0. , 11.11111111, 22.22222222, 33.33333333,
44.44444444, 55.55555556, 66.66666667, 77.77777778,
88.88888889, 100. ])
"""
# arange(0,100,2) 一维等差数列
np.arange(0, 100, 10)
# array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
# random
np.random.randint(0,80,size=(3,4))
"""
array([[31, 57, 36, 27],
[18, 77, 22, 23],
[11, 28, 74, 9]])
"""
np.random.random(size=(3,4))
"""
array([[0.83198977, 0.30977806, 0.59758229, 0.87239246],
[0.98302087, 0.46740328, 0.87574449, 0.2960687 ],
[0.13129105, 0.84281793, 0.6590363 , 0.5954396 ]])
"""
# 随机因子(系统时间),无时无刻都在变化
# 当随机因子固定下来,随机性就固定了
np.random.seed(10)
np.random.randint(0,100,size=(2,3))
# 如下,每次产生的随机数都一样
"""
array([[ 9, 15, 64],
[28, 89, 93]])
"""
# numpy 常用属性
"""
shape --> 形状,几行几列 -- 重点
ndim --> 维度数
size --> 数组长度
dtype --> 数组元素的类型 -- 重点
"""
arr = np.random.randint(0,20,size=(3,4))
# display(arr.shape)
# display(arr.ndim)
# display(arr.size)
# display(arr.dtype)
"""
(3, 4) # 3行4列
2 # 二维
12 # 12个元素
dtype('int32') # int32类型
"""
# numpy数据类型(数组元素的类型)
# np.array(dtype='int32') # 设定数据类型
arr.dtype = 'int16' # 修改数据类型
# numpy的索引和切片操作(重点)
# 作用 帮我们取出numpy数组中任意指定的局部数据
# 原理与列表相同
arr
# 取一行
# arr[1]
# array([ 0, 0, 10, 0, 8, 0, 4, 0], dtype=int16)
# 取多行
arr[[1,2,]]
"""
array([[ 0, 0, 10, 0, 8, 0, 4, 0],
[19, 0, 16, 0, 4, 0, 15, 0]], dtype=int16)
"""
# 切片
# 切出前两行
arr[:2]
"""
array([[16, 0, 17, 0, 8, 0, 9, 0],
[ 0, 0, 10, 0, 8, 0, 4, 0]], dtype=int16)
"""
# 切出前两列
arr[:,0:2]
"""
array([[16, 0],
[ 0, 0],
[19, 0]], dtype=int16)
"""
# 切出前两行的前两列
arr[:2,:2]
"""
array([[16, 0],
[ 0, 0]], dtype=int16)
"""
# 列翻转,第一列变最后一列,最后一列变第一列
arr[:,::-1]
"""
array([[ 0, 9, 0, 8, 0, 17, 0, 16],
[ 0, 4, 0, 8, 0, 10, 0, 0],
[ 0, 15, 0, 4, 0, 16, 0, 19]], dtype=int16)
"""
# 行翻转,第一行变最后一行,最后一行变第一行
arr[::-1,:]
"""
array([[19, 0, 16, 0, 4, 0, 15, 0],
[ 0, 0, 10, 0, 8, 0, 4, 0],
[16, 0, 17, 0, 8, 0, 9, 0]], dtype=int16)
"""
# 元素反转
display(arr)
# arr[::-1,::-1]
"""
array([[ 0, 15, 0, 4, 0, 16, 0, 19],
[ 0, 4, 0, 8, 0, 10, 0, 0],
[ 0, 9, 0, 8, 0, 17, 0, 16]], dtype=int16)
"""
#变形
arr = np.array([[1,2,3],[4,5,6]])
arr.shape
# (2, 3)
# 从二维变一维
arr_1 = arr.reshape((6,))
arr_1
# array([1, 2, 3, 4, 5, 6])
# 一维变多维
arr_2 =arr_1.reshape((6,1))
arr_2
"""
array([[1],
[2],
[3],
[4],
[5],
[6]])
"""
# 自动计算行列数
arr_3 = arr_1.reshape((3,-1)) # -1表示自动计算行列
arr_3
"""
array([[1, 2],
[3, 4],
[5, 6]])
"""
#%%
# 级联操作
# 将多个numpy 数组进行横向或者纵向的拼接
# axis轴向
arr
n_arr = arr
# display(arr, n_arr)
"""
array([[1, 2, 3],
[4, 5, 6]])
array([[1, 2, 3],
[4, 5, 6]])
"""
np.concatenate((arr, n_arr),axis=0) # 0表示纵向级联
"""
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
"""
a = np.array([[1,2],[3,4]])
np.concatenate((a, arr), axis=1) # 1表示横向级联
"""
array([[1, 2, 1, 2, 3],
[3, 4, 4, 5, 6]])
"""
#%%
#广播机制
"""
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式,
对数组的算术运算通常在相应的元素上进行。如果两个数组 a 和 b 形状相同,
即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。
这要求维数相同,且各维度的长度相同。
"""
#规则
"""
让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
输出数组的形状是输入数组形状的各个维度上的最大值。
如果输入数组的某个维度和待计算数组的对应维度的长度相同或者其长度为 1 时,
这个数组能够用来计算,否则出错。
当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值
"""
x = np.array([[1,2,3],[1,2,3]])
y = np.array([[4,5,6],[4,5,6]])
x+y # 对应位置相加
"""
array([[5, 7, 9],
[5, 7, 9]])
"""
z = np.array([1,3,4])
x+z
"""
x为二维,z为一维,以二维为准,将z加到了x的每一维上
array([[2, 5, 7],
[2, 5, 7]])
"""
#%%
# 常用聚合操作
# sum
# max
# min
# mean ?
"""
array([[1, 2, 3],
[4, 5, 6]])
"""
arr.sum(axis=1)
# array([ 6, 15])
arr.mean() # 3.5平均
#常用数学函数
# sin(), cos(), tan()
# numpy.around(a,decimals) 返回指定数字的四舍五入值
# a为数组,decimals舍入的小数位数,默认为0,如果为负则往小数点左侧进行
#%%
# 常用统计函数
"""
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)。换句话说,标准差是方差的平方根。
"""
np.random.seed(10)
arr = np.random.randint(60,100,size=(5,3))
"""
array([[69, 96, 75],
[60, 88, 85],
[89, 89, 68],
[69, 60, 96],
[76, 96, 71]])
"""
np.amin(arr,axis=1) # 横向的最小值
# array([69, 60, 68, 60, 71])
np.amax(arr,axis=0) # 纵向最大值
# array([89, 96, 96])
np.median(arr, axis=0) # 纵向平均
# array([69., 89., 75.])
# 标准差 std = sqrt(mean((x-x.mean())**2))
arr = np.array([1,2,3,4,5])
((arr-arr.mean())**2).mean()**0.5
# 1.4142135623730951
# 可以直接std()
arr.std() #1.4142135623730951
# 方差
arr.var() # 2.0
#%%
#矩阵
"""
NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,
而不是 ndarray 对象。一个 的矩阵是一个由行(row)列(column)
元素排列成的矩形阵列
matlib.empty() 函数返回一个新的矩阵,
语法格式为:numpy.matlib.empty(shape, dtype),填充为随机数据
参数介绍:
- shape: 定义新矩阵形状的整数或整数元组
- Dtype: 可选,数据类型
"""
import numpy.matlib as matlib
matlib.empty(shape=(3,4))
"""
matrix([[0.41366737, 0.77872881, 0.58390137, 0.18263144],
[0.82608225, 0.10540183, 0.28357668, 0.06556327],
[0.05644419, 0.76545582, 0.01178803, 0.61194334]])
"""
# numpy.matlib.zeros(), numpy.matlib.ones()返回填充为0或者1的矩阵
matlib.ones(shape=(3,4))
"""
matrix([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
"""
# numpy.matlib.eye() 函数返回一个矩阵,对角线元素为 1,其他位置为零
# umpy.matlib.eye(n, M,k, dtype)
# - n: 返回矩阵的行数
# - M: 返回矩阵的列数,默认为 n
# - k: 对角线的索引
# - dtype: 数据类型
matlib.eye(3,4)
"""
matrix([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]])
"""
# 单位矩阵 行列数一致且对角线值为1其他值为0的矩阵
matlib.eye(3,3,k=0)
"""
matrix([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
"""
# numpy.matlib.identity() 函数返回给定大小的单位矩阵。
# 单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,
# 除此以外全都为 0
matlib.identity(5)
"""
matrix([[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.]])
"""
# 转置矩阵 .T
arr = np.random.randint(0,10,size=(5,5))
display(arr)
arr.T # 行变列,列变行
"""
array([[1, 3, 6, 5, 5],
[1, 8, 0, 5, 9],
[8, 5, 7, 8, 5],
[8, 9, 9, 1, 5],
[9, 1, 4, 7, 7]])
array([[1, 1, 8, 8, 9],
[3, 8, 5, 9, 1],
[6, 0, 7, 9, 4],
[5, 5, 8, 1, 7],
[5, 9, 5, 5, 7]])
"""
# 矩阵相乘
"""
第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),
然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。
也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,
对应位置的每个值的乘积之和。
"""
a = np.array([[2,1],[4,3]])
b = np.array([[1,2],[1,0]])
display(a,b)
np.dot(a,b)
"""
array([[2, 1],
[4, 3]])
array([[1, 2],
[1, 0]])
101
array([[3, 4],
[7, 8]])
"""