numpy重在数值计算,也是大部分Python科学计算库的基础库
创建数组
1.
import numpy as np
t1=np.array([1,2,3])
print(t1)
print(type(t1))
[1 2 3] 打印出来没有逗号
<class 'numpy.ndarray'> 类型 ndarray 数组类型
2.b=np.arry(range(1,6))
3.
import numpy as npt1=np.arange(1,10,1)print(t1)print(type(t1))
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
数组的类名
type(t1) -----> numpy.ndarry
数据的类型
a.dtype------>‘int64’当前数组存放的数据的类型,自己加的64,我电脑6
数据类型的手动指定
b=np.arry(range(1,6),dtype=float)
b=np.arry(range(1,6),dtype='float64')
print(b.dtype)#float64
import numpy as npt5=np.array([1,0,1,0],dtype=bool)#布尔类型print(t5)
[ True False True False]
调整数据类型
t6.t5.astype('int8') #就变回去了
修改浮点型的小数位数
import numpy as np
import random
t7=np.array([random.random() for i in range(10)])#生成随机数print(t7)
t8= np.round(t7,2)#保留两位小数print(t8)
[0.93 0.83 0.66 0.67 0.54 0.64 0.9 0.62 0.83 0.07]
数组的形状
import numpy as np
import randomt1 = np.arange(12)
print(t1.shape)
t2=np.array([[1,2,4,5],[5,6,3,9]])
print(t2.shape)
(12,) #只有一个表示个数,一位数组
(2, 4)#两行4列,二维数组
修改数组的形状
a.recshape(3,4)
import numpy as npimport randomt2=np.arange(1,11,1)t2.reshape((2,5))
import numpy as np
import random
t2=np.arange(1,25,1)t2.reshape((2,3,4))#产生一个返回值
print(t2.reshape((2,3,4)))#2表示块,3每一块三行,4列
[[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]][[13 14 15 16]
[17 18 19 20]
[21 22 23 24]]]
t2还是原来的t2,它本身不会发生变化
t2=t2.reshape((2,3))#原地操作,没有返回值
二维变一维 t2.reshape((24, 不要写))
t2.reshape((1,24))#二维数组 t2.reshape(1,24)#不传元组也是可以的
不知道数字有多少个的情况下变成一维的数组
t2.shape[0]*t2.shape[1]#知道它一共的个数
t3=t2.reshape((t2.shape[0]*t2.shape[1],))
t3=t2.flatten()#展平
t2+2每个数字都加2,和MATLAB一样
import numpy as np
t2=np.arange(0,24,1)
t3=t2.reshape((4,6))/0
print(t3)
[[nan inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]
[inf inf inf inf inf inf]] #除以0还是可以运行的nan是0/0的结果,Not a Number,非数
数组一样,加减乘除都是对应位置的计算
数组不一样大,维度相同的做计算
import numpy as np
t2=np.array([0,1,2,3,4,5])
t3=(np.array(range(0,24,1))).reshape(4,6)
print(t3-t2)
[[ 0 0 0 0 0 0]
[ 6 6 6 6 6 6]
[12 12 12 12 12 12]
[18 18 18 18 18 18]]
不同维的会报错
二维的有一个维度是一样的就可以计算
如果两个数组的后缘维度(即从末尾开始算起的维度)的周长相符,则认为他们是广播兼容的。广播会在缺失的维度上进行
shape为(3,3,3)的数组不能和(3,2)的数组进行计算
shape为(3,3,2)的数组能够和(3,2)和(3,3)的数组进行计算
在某个方向上维度是一样的就可以计算
轴
在numpy中可以理解为方向,使用0,1,2..数字表示,对于一个一维数组,只有0轴,对于2维数组,有0轴和1轴,对于三维数组有0,1,2轴
块这个轴是0轴,其他就是行列
numpy读取数据
CSV——逗号分隔值文件
显示:表格状态
no.loadtxt(frame.dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
frame:文件路径 delimiter:分割 skiprows:跳过行 usecols:用那几列 unpack:转置
t2.transpose() t2.T #转置 t2.swapaxes(1,0)#交换轴
三个效果一样
numpy索引和切片
t2[1:3]取多行 t2[2]取第二行
取不连续的多行 t2[ [2,8,10] ]
取列
t2[行,列]
t2[:,1]取第一列,所有的行都要
取多行和多列
t2[2,3] #三行四列的值
t2[2:5,1:4]]#取3-5行,2-4列的交叉点值 0开始的
取多个不相邻的点
t2[ [0,2] ,[0,1] ]#取3-5行,2-4列的值 【0,0】这个值 ,【2,1】这个值
numpy数值的修改
t[:,2:4]=0
t2[t2<10]=0 #让t2中小于10的等于3
np.where(t2<10,0,10)#把小于10的换成0,把大于10 的变成10
t2.clip(10,18)小于10的替换为10,大于18的替换成18
nan没有被替换,nan是一个浮点类型
t2.astype(float)
t2[3,3]=np.nan
数组的拼接
np.vstack((t1,t2)) #竖直拼接
np.hstack((t1,t2)) #水平拼接
水平分割和水平拼接正好相反 (竖直)
行列交换
t[ [1,2], : ] = t[ [2,1], :] #第二行和第三行交换
构造全为0的数组 np.zeros((t2.shape[0],1)) #全为1 np.ones
创建一个对角线为1的正方形数组(方阵):np.eye(3)
#获取最大值,最小值的位置 np.argmax(t,axis=0) axis=0表示,行与行之间的值比较,就是列的最大值
np.argmin(t,axis=1)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]---------------------------------
[3 3 3 3 3 3]
numpy生成随机数
参数 | 解释 |
.rand(n,m) | 创建n*m维度的均匀分布的随机数组,浮点数,范围从0-1 |
.randn(n,m) | 符合标准正态分布的随机数组,平均数为0,标准差为1 |
.randint(low,high,(shape)) | 从给定上下限范围选取随机数整数 |
.uniform(low,high,(size)) | 产生均匀分布的数组 |
.seed(s) | 随机种子,s是给定的种子值。因为计算机生成的是伪随机数,所以通过设定相同的随机种子,可以每次生成相同的随机数 |
import numpy as npnp.random.seed(10)#添加随机种子print(np.random.randint(0,20,(3,4)))
seed里面的数字就是一个标记,随便写任何值都是可以的,就是标记一下你这个随机数据的编号
第一次是随机的,后面的结果都是一样的
a=b 完全不复制,a和b相互影响
a=b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的
a=b.copy(),复制,a和b相互不影响
nan和inf (浮点类型)
nan(NAN,Nan):表示不是一个数字,nan浮点类型
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
不合适的运算inf-inf,也会出现nan
inf(-inf,inf): inf正无穷
除以0(python会直接报错,numpy中则是无穷)
两个nan是不相等的
np.nan==np.nan#False
判断数组中不为0值的个数
np.count_nonzero(t2)
判断数组中为nan值的个数
np.count_npnzero(t2!=t2) # t2!=t2只有nan这个位置 true (1)
np.isnan(t2)
nan和任何值计算都是nan
t.sum(axis=None)#求和 axis=0 行和行相加变成一行
不传就是求所有数的和
t.mean(axis=None)#均值
np.median(t,axis=None)#中位数
t.max(axis=None)#最大值
t.min(axis=None)#最小值
np.ptp(t2,axis=None)#极值
t.std(axis=None)#标准差
矩阵操作
import numpy as np
A=np.array([5,1,10,20,30])
print(A==10)
print(A[A==10])#A[true]就给它取出来