Python-科学计算库 Numpy
ndarray 的简单特性
ndarray是 Numpy 中的 array(下文的 array 全部为 ndarray), 可以直接进行加减乘除。
array = np. array( [ 1 , 2 , 3 , 4 , 5 ] )
print ( 'numpy 中的 array 格式:' , type ( array) )
print ( array + 1 )
<class ‘numpy.ndarray’> [2 3 4 5 6]
array. shape
(5,)
array 结构相关
大家关注的可能还是 ndarray 关于矩阵方面的操作
一维
array 默认要求内部所有的数据元素的数据类型是相同的(可以通过参数进行设置) 属性名称以及对应表示
目的 方式 数据类型 .dytype 结构(行列) .shape 元素个数 .size 每个元素所占的字 .itemsize 维数 .ndim 索引 [0] 切片 [1:3] 或者 [-2:] 总字节数 .nbytes 在[0~100)中构造十个等差数列 np.arange(0,100,10)
tang_list = [ 1 , 2 , 3 , 4 , 5 ]
tang_array = np. array( tang_list)
print ( tang_array. dtype)
print ( '每个 int 占多少个字节:' , tang_array. itemsize)
print ( 'tang_array 的结构(行,列):' , tang_array. shape)
print ( 'tang_array 的元素个数:' , tang_array. size)
print ( 'tang_array 的维数:' , tang_array. ndim)
print ( 'tang_array 的索引:' , tang_array[ 0 ] )
print ( 'tang_array 的切片:' , tang_array[ 1 : 3 ] )
print ( 'tang_array 的切片:' , tang_array[ - 2 : ] )
二维(矩阵形式)
目的 方式 二维矩阵的直接创建 tang_array = np.array([[1,2,3],[4,5,6], [7,8,9]]) 索引方式 print(‘取第一行的值:’,tang_array[1]) print(‘取第一列的值:’,tang_array[:,1]) print(‘取第一列的前两个值:’,tang_array[0:2,1]) print(‘取第一行前两个的值:’,tang_array[0,0:2]) 等号赋值 # 等号赋值是直接指向 tang_array 的位置 tang_array2 = tang_array (创建一个新矩阵进行操作,不修改原有矩阵) #使用 copy 进行复制,两个矩阵互不干扰 tang_array2 = tang_array.copy()
tang_array = np. array( [ [ 1 , 2 , 3 ] ,
[ 4 , 5 , 6 ] ,
[ 7 , 8 , 9 ] ] )
print ( 'tang_array 的结构(行,列):' , tang_array. shape)
print ( 'tang_array 的元素个数:' , tang_array. size)
print ( 'tang_array 的维数:' , tang_array. ndim)
print ( tang_array[ 1 ] [ 1 ] )
tang_array[ 1 ] [ 1 ] = 10
print ( tang_array[ 1 ] [ 1 ] )
print ( '取第一行的值:' , tang_array[ 1 ] )
print ( '取第一列的值:' , tang_array[ : , 1 ] )
print ( 'tang_array:\n' , tang_array)
print ( '取第一列的前两个值:' , tang_array[ 0 : 2 , 1 ] )
print ( '取第一行前两个的值:' , tang_array[ 0 , 0 : 2 ] )
print ( '\n' )
tang_array2 = tang_array
tang_array2[ 1 ] [ 1 ] = 100
print ( '等号直接赋值:\n' )
print ( '矩阵 array_tang :\n' , tang_array)
print ( '\n' )
print ( '矩阵 array_tang2 :\n' , tang_array2)
print ( '\n' )
tang_array2 = tang_array. copy( )
tang_array2[ 1 ] [ 1 ] = 1000
print ( 'copy 进行复制:\n' )
print ( '矩阵 array_tang :\n' , tang_array)
print ( '\n' )
print ( '矩阵 array_tang2 :\n' , tang_array2)
print ( '\n' )
ndarray 的索引和改变数据类型
ndarray 的索引其实可以是 bool 数组,返回 true 的索引所在的数据
目的 方式 布尔数据作为索引 c_arr[mask] np.where(c_arr > 50)) c_arr[c_arr > 50] 制定 ndarray 的数据类型 c_arr = np.array([1,2,3,4,5],dtype = np.float32) 什么格式都可以的 ndarray c_arr = np.array([1,2,3.5,“str”],dtype = object) 改变数据类型(直接.astype 不会改变其类型,需要重新赋值) c_arr = c_arr.astype(np.float32) 改变数据类型同时进行复制 c_arr2 = np.asarray(c_arr,dtype = np.float32)
c_arr = np. arange( 0 , 100 , 10 )
print ( '构造等差数组:' , c_arr)
print ( '\n' )
mask = np. array( [ 0 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 ] , dtype = bool )
print ( '将 bool 类型数组作为索引:' , c_arr[ mask] )
mask = c_arr > 50
print ( '将 bool 类型数组作为索引输出大于 50 的数:' , c_arr[ mask] )
print ( '输出大于 50 的索引:' , np. where( c_arr > 50 ) )
print ( '将 bool 类型数组作为索引输出大于 50 的数:' , c_arr[ c_arr > 50 ] )
print ( '\n' )
c_arr = np. array( [ 1 , 2 , 3 , 4 , 5 ] , dtype = np. float32)
print ( c_arr)
print ( 'c_arr 的类型:' , c_arr. dtype)
print ( 'c_arr 所占的总字节数:' , c_arr. nbytes)
c_arr = np. array( [ 1 , 2 , 3.5 , "str" ] , dtype = object )
print ( 'c_arr:' , c_arr)
c_arr = np. array( [ 1 , 2 , 3 , 4 , 5 ] )
c_arr2 = np. asarray( c_arr, dtype = np. float32)
print ( 'np.asarray()不会修改原有数据(貌似所有的这些函数都不会修改原有数据):' , np. asarray( c_arr, dtype = np. float32) )
print ( 'c_arr:' , c_arr)
print ( '复制并转换数据类型后的结果:' , c_arr2)
print ( '直接改变数据类型(原始的 c_arr 不变,想要操作新的 ndarray,可以设置新的ndarray):' , c_arr. astype( np. float32) )
print ( '\n' )
array数组、矩阵便捷的计算函数
行相加、列相加、最大值、最小值、最大值索引、最小值索引、平均值、标准差、方差、添加限制
目的 方式 初始化矩阵 c_arr = np.array([[1,2,3],[4,5,6]]) 所有元素求和 np.sum(c_arr) 行相加 np.sum(c_arr,axis = 0) 列相加 np.sum(c_arr,axis = 1) np.sum(c_arr,axis = -1) 所有元素 以下括号中 axis = 0 为行相关 axis = 1 为列相关 相乘 c_arr.prod() 最小值 c_arr.min() 最大值 c_arr.max() 返回最大值索引 c_arr.argmax() 平均值 c_arr.mean() 标准差 c_arr.std() 方差 c_arr.var() 对所有元素添加限制(过滤) 矩阵中小于 2 的全部为 2,大于 4 的全部为 4 c_arr.clip(2,4) 四舍五入 c_arr.round() 四舍五入添加精度 c_arr.round(decimals = 1)
c_arr = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
print ( np. sum ( c_arr) )
print ( "行相加:" , np. sum ( c_arr, axis = 0 ) )
print ( '维度共有:' , c_arr. ndim)
print ( '列相加:' , np. sum ( c_arr, axis = 1 ) )
print ( '列相加:' , np. sum ( c_arr, axis = - 1 ) )
print ( '\n' )
print ( '相乘:' , c_arr. prod( ) )
print ( "行相乘:" , c_arr. prod( axis = 0 ) )
print ( '列相乘:' , c_arr. prod( axis = 1 ) )
print ( '\n' )
print ( "最小值:" , c_arr. min ( ) )
print ( "最小行:" , c_arr. min ( axis = 0 ) )
print ( '最小列:' , c_arr. min ( axis = 1 ) )
print ( '\n' )
print ( "最大值:" , c_arr. max ( ) )
print ( "最大行:" , c_arr. max ( axis = 0 ) )
print ( '最大列:' , c_arr. max ( axis = 1 ) )
print ( '\n' )
print ( "最大值的索引:" , c_arr. argmax( ) )
print ( "行中最大的索引:" , c_arr. argmax( axis = 0 ) )
print ( '列中最大的索引:' , c_arr. argmax( axis = 1 ) )
print ( '\n' )
print ( "平均值:" , c_arr. mean( ) )
print ( "行平均值:" , c_arr. mean( axis = 0 ) )
print ( '列平均值:' , c_arr. mean( axis = 1 ) )
print ( '\n' )
print ( "标准差:" , c_arr. std( ) )
print ( "行标准差:" , c_arr. std( axis = 0 ) )
print ( '列标准差:' , c_arr. std( axis = 1 ) )
print ( '\n' )
print ( "方差:" , c_arr. var( ) )
print ( "行方差:" , c_arr. var( axis = 0 ) )
print ( '列方差:' , c_arr. var( axis = 1 ) )
print ( '\n' )
c_arr = np. array( [ [ 1.1 , 2.4 , 3.6 ] , [ 4.5 , 5.4 , 6.3 ] ] )
print ( "矩阵中小于 2 的全部为 2,大于 4 的全部为 4:\n" , c_arr. clip( 2 , 4 ) )
print ( "四舍五入:\n" , c_arr. round ( ) )
print ( "四舍五入添加精度:\n" , c_arr. round ( decimals = 1 ) )
print ( '\n' )
数组形状操作(修改维度)
目的 方式 初始化 0~9 的 一维 ndarray c_arr = np.arange(10) 修改成二维的 ndarray,元素总量相等 c_arr.shape = 2,5 c_arr = c_arr.reshape(1,10) 添加新维度 c_arr = c_arr[np.newaxis,:] np.newaxis的插入位置即你想添加的维度位置(这个用法还比较迷) 删除多余的维度之后 c_arr.squeeze() 转置 c_arr = c_arr.transpose() 转置简便表示 T c_arr = c_arr.T
c_arr = np. arange( 10 )
print ( 'c_arr 的维度:\n' , c_arr. shape)
c_arr. shape = 2 , 5
print ( 'c_arr 两行五列:\n' , c_arr)
c_arr = c_arr. reshape( 1 , 10 )
print ( 'c_arr :\n' , c_arr. reshape( 1 , 10 ) )
print ( '\n' )
print ( 'c_arr 的维度:\n' , c_arr. shape)
print ( 'c_arr 删除多余的维度之后:\n' , c_arr. squeeze( ) )
print ( 'c_arr 删除多余的维度之后的维度:\n' , c_arr. shape)
print ( '\n' )
c_arr = c_arr[ np. newaxis, : ]
print ( 'c_arr 添加新维度 的维度:\n' , c_arr. shape)
print ( 'c_arr 删除多余的维度之后:\n' , c_arr. squeeze( ) )
c_arr = c_arr. squeeze( )
print ( 'c_arr 删除多余的维度之后的维度:\n' , c_arr. shape)
print ( '\n' )
c_arr = np. arange( 10 )
c_arr. shape = 2 , 5
c_arr = c_arr. transpose( )
print ( 'c_arr 转置之后:\n' , c_arr)
c_arr = c_arr. T
print ( 'c_arr 再转置之后:\n' , c_arr)
数组的连接
目的 方式 竖着拼接 c = np.concatenate((a,b))#默认 axis = 0 c = np.vstack((a,b)) 横着拼接 c = np.concatenate((a,b),axis = 1) c = np.hstack((a,b)) 拉平 a.flatten() a.ravel()
a = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
b = np. array( [ [ 11 , 22 , 33 ] , [ 44 , 55 , 66 ] ] )
c = np. concatenate( ( a, b) )
print ( '竖着拼接:\n' , c)
c = np. concatenate( ( a, b) , axis = 1 )
print ( '横着拼接:\n' , c)
print ( '拉平:\n' , a. flatten( ) )
print ( '拉平:\n' , a. ravel( ) )
print ( 'a不变:\n' , a)
数组、网格、向量、单位矩阵的构造
目的 方式 2~20之间,步长为 2 的数组 c_arr = np.arange(2,20,2,dtype = np.float32) 0~10之间的五十个间距相等 的数 c_arr = np.linspace(0,10,50) 默认以十为底,输出值在 0~1 之间的x c_arr = np.logspace(0,1,5) 构造一个二维的网格 linspace x = np.linspace(-10,10,5) y = np.linspace(-10,10,5) x,y = np.meshgrid(x,y) 行向量/列向量 c_arr = np.r_[0:10:1] c_arr = np.c_[0:10:1] 构造一个零数组/矩阵 c_arr = np.zeros(3) c_arr = np.zeros((3,3) ) 构造一个一数组/矩阵 c_arr = np.ones((3,3) ) 构造一个空数组/矩阵 c_arr = np.empty(6) 构造单位矩阵 c_arr = np.identity(5)
c_arr = np. arange( 2 , 20 , 2 , dtype = np. float32)
print ( '2~20之间,步长为 2 的数:\n' , c_arr)
c_arr = np. linspace( 0 , 10 , 50 )
c_arr = np. logspace( 0 , 1 , 5 )
print ( '默认以十为底,输出值在 0~1 之间的x' , c_arr)
print ( '\n' )
x = np. linspace( - 10 , 10 , 5 )
y = np. linspace( - 10 , 10 , 5 )
x, y = np. meshgrid( x, y)
print ( x)
print ( y)
print ( '\n' )
c_arr = np. r_[ 0 : 10 : 1 ]
print ( '构造一个行向量:\n' , c_arr)
c_arr = np. c_[ 0 : 10 : 1 ]
print ( '构造一个列向量:\n' , c_arr)
print ( '\n' )
c_arr = np. zeros( 3 )
print ( '构造一个0数组:\n' , c_arr)
c_arr = np. zeros( ( 3 , 3 ) )
print ( '构造一个0数组:\n' , c_arr)
c_arr = np. ones( ( 3 , 3 ) )
print ( '构造一个1数组:\n' , c_arr)
c_arr = np. ones( ( 3 , 3 ) ) * 8
print ( '构造一个8数组:\n' , c_arr)
print ( '\n' )
c_arr = np. empty( 6 )
c_arr. fill( 1 )
print ( '构造一个空数组:\n' , c_arr)
print ( '\n' )
c_arr = np. arange( 2 , 20 , 2 , dtype = np. float32)
print ( 'c_arr 数组:\n' , c_arr)
c_arr_zeroslike = np. zeros_like( c_arr)
print ( '构造一个和 c_arr 一样大小比例的0数组 c_arr_zeroslike:\n' , c_arr_zeroslike)
c_arr_oneslike = np. ones_like( c_arr)
print ( '构造一个和 c_arr 一样大小比例的1数组 c_arr_oneslike:\n' , c_arr_oneslike)
print ( '\n' )
c_arr = np. identity( 5 )
print ( 'c_arr 5*5 单位矩阵:\n' , c_arr)
运算
目的 方式 对应元素相乘 * z = np.multiply(x,y) z = x * y 两向量相乘(内积)/矩阵相乘 z = np.dot(x,y) 判断操作 np.logical_and(x,y) np.logical_or(x,y) np.logical_not(x,y)
x = np. array( [ 1 , 2 ] )
y = np. array( [ 3 , 4 ] )
z = np. multiply( x, y)
print ( '对应元素相乘:' , z)
z = np. dot( x, y)
print ( '两向量相乘(内积):' , z)
x. shape = 2 , 1
y. shape = 1 , 2
z = np. dot( x, y)
print ( '两矩阵相乘:\n' , z)
z = np. dot( y, x)
print ( '两矩阵相乘:\n' , z)
x = np. array( [ 1 , 1 , 1 ] )
y = np. array( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] )
print ( '* 也可以相乘,Numpy 会自动补全维度,但是不要图省事' , x * y)
x = np. array( [ 1 , 1 , 1 ] )
y = np. array( [ 1 , 1 , 1 ] )
print ( x == y)
print ( '矩阵之间的与操作' , np. logical_and( x, y) )
print ( '矩阵之间的或操作' , np. logical_or( x, y) )
print ( '矩阵之间的非操作' , np. logical_not( x, y) )
随机模块
方式 用法 随机生成的 0~1 之间的 3 行 2 列 浮点数 c_arr = np.random.rand(3,2) 随机获取 0~1 之间的浮点数 np.random.rand() np.random.random_sample() 随机生成的 0~10 之间的 5 行 4 列 整数 c_arr = np.random.randint(10,size=(5,4)) 随机生成的 0~10 之间的3个整数 np.random.randint(0,10,3) 高斯分布 mu,sigma = 0,0.1 'print(‘高斯分布’,np.random.normal(mu,sigma,10)) 设置 打印 参数 np.set_printoptions(precision = 2) 洗牌 会修改原有值 np.random.shuffle(c_arr) 随机的种子(生成的随机数就固定了) np.random.seed(100)
c_arr = np. random. rand( 3 , 2 )
print ( '随机生成的 0~1 之间的 3 行 2 列 浮点数' , c_arr)
c_arr = np. random. randint( 10 , size= ( 5 , 4 ) )
print ( '随机生成的 0~10 之间的 5 行 4 列 整数' , c_arr)
print ( np. random. rand( ) )
print ( np. random. random_sample( ) )
print ( '随机生成的 0~10 之间的3个整数' , np. random. randint( 0 , 10 , 3 ) )
mu, sigma = 0 , 0.1
print ( '高斯分布' , np. random. normal( mu, sigma, 10 ) )
np. set_printoptions( precision = 2 )
print ( '设置完参数的高斯分布' , np. random. normal( mu, sigma, 10 ) )
c_arr = np. arange( 10 )
np. random. shuffle( c_arr)
print ( '洗过牌之后的 shuffle_arr:\n' , c_arr)
np. random. seed( 100 )
mu, sigma = 0 , 0.1
print ( '高斯分布' , np. random. normal( mu, sigma, 10 ) )
文件的读写
Numpy 可以直接读取文件,设置间隔符读取文件,限定行数读取文件 保存 array ,设置间隔符、数据类型、小数点位数 保存 成 npy 或者 npz(保存成多个文件并且放置在一起) 格式
目的 方式 读取文件 data = np.loadtxt(‘c.txt’) 默认分隔符为空格 指定分隔符 data = np.loadtxt(‘c2.txt’,delimiter = ‘,’) 指定分隔符且去掉第一行 data = np.loadtxt(‘c3.txt’,delimiter = ‘,’,skiprows = 1) numpy 保存数据 np.savetxt(‘c4.txt’,c_arr,fmt = ‘%.2f’,delimiter = ‘,’) 将 c和 c2 保存在同样一个压缩文件中 np.savez(‘c.npz’,a = c,b = c2) 读取 npz 中的数据 data = np.load(‘c.npz’) print(‘data 中有什么:\n’,data.keys()) print(‘data 中a 文件内有什么:\n’,data[‘a’])