模块--NumPy
NumPy
In [2]:
import numpy as np
# ndarray 多维数组结构,高效节省空间,直接对整组数据进行快速运算
In [2]:
# ndarray - 多维数组对象
# 数组 - 定长的相同基础数据类型的集合
In [23]:
import random
a = [random.uniform(100,500) for i in range(50)]
In [24]:
aa = np.array(a) # 将一个列表转化为array
In [25]:
aa
Out[25]:
In [26]:
# 返回多维数组
aa.reshape(5,10) # 5*10的二维数组
Out[26]:
In [27]:
aa #原值不会改变
Out[27]:
In [28]:
aa*2 # 整组数据同时*2
Out[28]:
In [8]:
a = np.array([random.uniform(100,500) for i in range(10)])
b = np.array([random.randint(5,10) for i in range(10)])
a*b # 两个长度相同的array中对应位置的数字相乘
Out[8]:
In [10]:
(a*b).sum() # array中元素的和
Out[10]:
In [23]:
# 多维array
a = [[1,2,3],[4,5,6],[7,8,9]]
np.array(a)
Out[23]:
In [24]:
b = np.array(a)
b.size # 返回array中基础元素个数
Out[24]:
In [25]:
len(b) # 包含的元素个数
Out[25]:
In [26]:
b.ndim # 维度
Out[26]:
In [27]:
b.shape # 二维array的行和列
Out[27]:
In [28]:
np.array([[[1,2,3],[2,3,4],[3,4,5]],[[1,2,3],[2,3,4],[3,4,5]]]).shape # 三维array
Out[28]:
In [29]:
b.T # 行列互换
Out[29]:
In [30]:
b.dtype # 查看类型
Out[30]:
In [31]:
# 布尔值bool_,整数int(8,16,32,64),无符号整数uint(8,16,32,64),浮点型float(16,32,64)
# 类型转换astype()
In [43]:
a = np.array([1,2,3,4,5,6,7])
In [44]:
print(a.dtype)
a.astype("float") # 不会修改原来的对象,生成一个新对象
Out[44]:
In [32]:
# array() 上面有
# arange() 类似于range,不同的是返回一个 array,步长可以是小数
np.arange(10)
Out[32]:
In [33]:
np.arange(0,10,0.4) # 生成0-10之间的数,步长是0.4
Out[33]:
In [34]:
# linspace() 指定起始位置和终止位置,第三个参数是生成的元素个数,这个是包含结束的
np.linspace(0,10,2)
Out[34]:
In [35]:
np.linspace(0,10,4)
Out[35]:
In [37]:
# zeros() ones() empty()
np.zeros(10) # 长度为10,初始值为0的array,默认创建的float类型可以通过dtype函数指定
Out[37]:
In [38]:
np.zeros((3,5)) # 创建多维数组,shape属性
Out[38]:
In [39]:
np.ones(10) # 床键初始值为1的array
Out[39]:
In [40]:
np.empty(10) # 只创建定长的array, 不会赋初始值,其值是内存中原有的值
Out[40]:
In [41]:
np.eye(10,dtype="int")
Out[41]:
数组与标量之间的运算¶
In [45]:
# a+1 a*3 1//a a**2
# 对array中的每一个元素进行计算
In [47]:
# a = np.array([1,2,3,4,5,6])
In [48]:
a>3 # 每个元素都进行计算,
Out[48]:
同样大小数组只间的运算¶
In [46]:
# a+b a/b a**b
# 这和上面都不会修改原来的对象
数组的索引¶
In [49]:
# 一维数组的切片与列表相同
a = np.arange(15).reshape((3,5)) # 将一个一维数组转换为3行5列的二维数组
a
Out[49]:
In [50]:
a[1][2],a[1,2] # 两种写法取索引相同,推荐后面的写法,切片会介绍
Out[50]:
In [51]:
# 要获取6,7,8,11,12,13
a[1:][1:4] # 结果并不是想要的,因为鲜切除了a[1:]再去切[1:4]两次都是切得行
Out[51]:
In [52]:
a[1:,1:4] # 切行和列
Out[52]:
In [53]:
# 与类表不同,数组在切片时并不会自动复制,在切片数组上修改会影响原数组
a = np.arange(15)
print(a)
b = a[1:5]
print(b)
b[1]=10
print(a)
In [54]:
# 解决方法copy()
a = np.arange(15)
print(a)
b = a[1:5].copy()
print(b)
b[1]=10
print(a)
布尔型索引¶
In [55]:
a = np.array([random.randint(0,10) for i in range(20)])
a
Out[55]:
In [56]:
# 获取大于5的数
a[a>5]
Out[56]:
In [58]:
# 原理a>5返回一个布尔值数组,a[a>5]会将True对应的值返回
a = np.arange(5)
a
Out[58]:
In [59]:
a[[True,True,False,False,False]]
Out[59]:
In [60]:
# 取数组中大于5,小于8的元素
a = np.array([random.randint(0,10) for i in range(20)])
a
Out[60]:
In [61]:
a[(a>5)&(a<8)] # &优先级大于比较运算符
Out[61]:
In [62]:
# 取小于5或大于8的数
a[(a<5)|(a>8)]
Out[62]:
In [63]:
# 取不小于5的数,可以用大于等于,下面用非
a[~(a<5)]
Out[63]:
花式索引¶
In [66]:
# 根据索引从数组中取值
a = np.arange(0,10,2)
print(a)
In [67]:
a[[3,2,1]]
Out[67]:
In [69]:
# 多维数组切片与花式索引联合取值
a = np.arange(15).reshape(3,5)
print(a)
a[1:,[1,3]] # ,一定是多维数组
Out[69]:
In [70]:
# 多维数组使用两个索引取值,想要得到第0行的1和3,和第2行的0和3
a[[0,2],[1,3]] # 会去取a[0][1]和a[2][3]
Out[70]:
In [71]:
# 想要得到想要的结果,就要切两次,一次切全部行,一次切全部列
print(a[[0,2],:]) # 第一行和第二行
print(a[[0,2],:][:,[1,3]]) # 第一列和第三列
In [72]:
# 数组转换回列表
a = np.arange(15)
print(a)
a.tolist()
Out[72]:
In [74]:
# 对数组内所有元素进行运算
a = np.arange(-10,10).reshape(4,5)
print(a)
In [75]:
# 绝对值
np.abs(a)
Out[75]:
In [76]:
a # 本身不会发生改变
Out[76]:
In [77]:
# ceil,f loor,rint,trunc 小数转化成整数
a = np.arange(-10.1,9.1,1).reshape(4,5)
print(a)
In [78]:
np.trunc(a)
Out[78]:
In [79]:
np.round(a)
Out[79]:
In [80]:
# isnan isinf
float("nan"),float("inf")
Out[80]:
In [81]:
# inf 代表无限大,5/n,n越小,结果越大,n为0时就代表无限大
# nan 不是一个数,他不等于任何数,甚至都不等于他自己
a = np.array([1,2,3,4,5])
b = np.array([1,1,1,1,0])
a/b # 给出了警告,但没有抛出异常
Out[81]:
In [82]:
a = np.array([1,2,3,4,0])
b = np.array([1,1,1,1,0])
a/b
Out[82]:
In [83]:
# nan表示数据的缺失值
# 过滤缺失值
c = a/b
np.isnan(c)
Out[83]:
In [84]:
c[~np.isnan(c)]
Out[84]:
In [85]:
# 更多一元函数sqrt平方根,exp,log.cos,sin,tan
In [86]:
# 二元函数add加,substract减,multlply乘,divide除,power乘方,mod取余
In [90]:
# maximum 和 minimum
a = np.array([1,2,3,4])
b = np.array([2,3,4,5])
np.maximum(a,b) # 将对应位置上最大的元素选出来
Out[90]:
In [92]:
np.minimum(a,b) # 选小的
Out[92]:
数学和统计方法¶
In [93]:
# sum 求和
a.sum()
Out[93]:
In [94]:
# 求平均数
a.mean()
Out[94]:
In [95]:
# max 最大值
a.max()
Out[95]:
In [96]:
# min 最小值
a.min()
Out[96]:
In [97]:
# argmax 最大值得下标
a.argmax()
Out[97]:
In [98]:
# argmin 最小值的下标
a.argmin()
Out[98]:
In [99]:
# std 求标准差
a.std()
Out[99]:
In [100]:
# var 求方差
a.var()
Out[100]:
随机数生成¶
In [101]:
# randint #返回随机整数
np.random.randint(10,20)
Out[101]:
In [102]:
# 可以返回一个随机数组
np.random.randint(10,20,10)
Out[102]:
In [103]:
np.random.randint(10,20,(3,5)) #返回一个多维数组
Out[103]:
In [3]:
# rand() 返回0-1之间的
np.random.rand()
Out[3]:
In [4]:
np.random.rand(10) # 返回一个数组
Out[4]:
In [6]:
np.random.rand(3,5) # 返回多维数组
Out[6]:
In [7]:
# choice 随机选择一个
np.random.choice([1,2,3,4,5,6,7,8])
Out[7]:
In [8]:
np.random.choice([1,2,3,4,5,6,7,8],4) #抽取4个
Out[8]:
In [10]:
np.random.choice([1,2,3,4,5,6,7,8],(2,2)) #抽取2*2的二维数组
Out[10]:
In [11]:
# shuffle 打乱原数组的顺序
a = np.random.rand(3,5)
a
Out[11]:
In [12]:
np.random.shuffle(a)
In [13]:
a
Out[13]:
In [14]:
# uniform 返回随机小数
np.random.uniform(10) # 0-10
Out[14]:
In [16]:
np.random.uniform(-10,1) # 指定范围-10-1
Out[16]:
In [17]:
np.random.uniform(-10,1,10) # 10个
Out[17]:
In [18]:
np.random.uniform(-10,1,(3,3)) # 3*3的二维数组
Out[18]: