模块--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]:
array([491.93070317, 360.57081605, 433.75081105, 491.35879073,
       247.61770955, 336.14009072, 306.72843121, 165.36129227,
       126.01471521, 107.23944223, 448.52647907, 230.19947579,
       433.69828877, 346.70386634, 163.15558269, 113.06560623,
       199.16324755, 472.51549345, 160.95640915, 126.44166425,
       447.92072897, 317.10326406, 338.75365187, 329.04933333,
       389.91914284, 428.44486082, 317.54396968, 258.05336499,
       452.51408802, 468.10292104, 265.13333734, 142.34298682,
       452.93235259, 499.01633747, 420.63596595, 430.44689176,
       284.48242919, 127.15356792, 178.17786444, 181.70366551,
       474.11597416, 498.10568931, 289.78577458, 486.74655632,
       405.57226464, 153.12497365, 353.05824413, 159.73867976,
       350.64414881, 315.96410087])
In [26]:
# 返回多维数组
aa.reshape(5,10) # 5*10的二维数组
Out[26]:
array([[491.93070317, 360.57081605, 433.75081105, 491.35879073,
        247.61770955, 336.14009072, 306.72843121, 165.36129227,
        126.01471521, 107.23944223],
       [448.52647907, 230.19947579, 433.69828877, 346.70386634,
        163.15558269, 113.06560623, 199.16324755, 472.51549345,
        160.95640915, 126.44166425],
       [447.92072897, 317.10326406, 338.75365187, 329.04933333,
        389.91914284, 428.44486082, 317.54396968, 258.05336499,
        452.51408802, 468.10292104],
       [265.13333734, 142.34298682, 452.93235259, 499.01633747,
        420.63596595, 430.44689176, 284.48242919, 127.15356792,
        178.17786444, 181.70366551],
       [474.11597416, 498.10568931, 289.78577458, 486.74655632,
        405.57226464, 153.12497365, 353.05824413, 159.73867976,
        350.64414881, 315.96410087]])
In [27]:
aa #原值不会改变
Out[27]:
array([491.93070317, 360.57081605, 433.75081105, 491.35879073,
       247.61770955, 336.14009072, 306.72843121, 165.36129227,
       126.01471521, 107.23944223, 448.52647907, 230.19947579,
       433.69828877, 346.70386634, 163.15558269, 113.06560623,
       199.16324755, 472.51549345, 160.95640915, 126.44166425,
       447.92072897, 317.10326406, 338.75365187, 329.04933333,
       389.91914284, 428.44486082, 317.54396968, 258.05336499,
       452.51408802, 468.10292104, 265.13333734, 142.34298682,
       452.93235259, 499.01633747, 420.63596595, 430.44689176,
       284.48242919, 127.15356792, 178.17786444, 181.70366551,
       474.11597416, 498.10568931, 289.78577458, 486.74655632,
       405.57226464, 153.12497365, 353.05824413, 159.73867976,
       350.64414881, 315.96410087])
In [28]:
aa*2 # 整组数据同时*2
Out[28]:
array([983.86140633, 721.1416321 , 867.5016221 , 982.71758146,
       495.2354191 , 672.28018144, 613.45686242, 330.72258453,
       252.02943042, 214.47888446, 897.05295815, 460.39895158,
       867.39657754, 693.40773268, 326.31116537, 226.13121247,
       398.32649509, 945.0309869 , 321.9128183 , 252.8833285 ,
       895.84145795, 634.20652811, 677.50730373, 658.09866666,
       779.83828568, 856.88972163, 635.08793936, 516.10672997,
       905.02817603, 936.20584207, 530.26667468, 284.68597363,
       905.86470517, 998.03267495, 841.2719319 , 860.89378353,
       568.96485838, 254.30713584, 356.35572887, 363.40733103,
       948.23194832, 996.21137862, 579.57154916, 973.49311263,
       811.14452927, 306.24994731, 706.11648827, 319.47735952,
       701.28829763, 631.92820174])
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]:
array([2874.03931247, 2978.38021423, 2016.80733007, 1111.0821935 ,
       4445.7525357 , 1615.76473205,  512.07877134,  720.81440601,
       4474.26899101, 2043.93893245])
In [10]:
(a*b).sum() # array中元素的和
Out[10]:
22792.92741883245
In [23]:
# 多维array
a = [[1,2,3],[4,5,6],[7,8,9]]
np.array(a)
Out[23]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [24]:
b = np.array(a)
b.size # 返回array中基础元素个数
Out[24]:
9
In [25]:
len(b) # 包含的元素个数
Out[25]:
3
In [26]:
b.ndim # 维度
Out[26]:
2
In [27]:
b.shape # 二维array的行和列
Out[27]:
(3, 3)
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]:
(2, 3, 3)
In [29]:
b.T # 行列互换 
Out[29]:
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
 

array中元素类型

In [30]:
b.dtype # 查看类型
Out[30]:
dtype('int32')
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") # 不会修改原来的对象,生成一个新对象
 
int32
Out[44]:
array([1., 2., 3., 4., 5., 6., 7.])
 

创建array

In [32]:
# array() 上面有
# arange() 类似于range,不同的是返回一个 array,步长可以是小数
np.arange(10)
Out[32]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [33]:
np.arange(0,10,0.4) # 生成0-10之间的数,步长是0.4
Out[33]:
array([0. , 0.4, 0.8, 1.2, 1.6, 2. , 2.4, 2.8, 3.2, 3.6, 4. , 4.4, 4.8,
       5.2, 5.6, 6. , 6.4, 6.8, 7.2, 7.6, 8. , 8.4, 8.8, 9.2, 9.6])
In [34]:
# linspace() 指定起始位置和终止位置,第三个参数是生成的元素个数,这个是包含结束的
np.linspace(0,10,2)
Out[34]:
array([ 0., 10.])
In [35]:
np.linspace(0,10,4)
Out[35]:
array([ 0.        ,  3.33333333,  6.66666667, 10.        ])
In [37]:
# zeros() ones() empty()
np.zeros(10) # 长度为10,初始值为0的array,默认创建的float类型可以通过dtype函数指定
Out[37]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [38]:
np.zeros((3,5)) # 创建多维数组,shape属性
Out[38]:
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
In [39]:
np.ones(10) # 床键初始值为1的array
Out[39]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [40]:
np.empty(10) # 只创建定长的array, 不会赋初始值,其值是内存中原有的值
Out[40]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [41]:
np.eye(10,dtype="int")
Out[41]:
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
 

索引与切片

数组与标量之间的运算

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]:
array([False, False, False,  True,  True,  True,  True])
 

同样大小数组只间的运算

In [46]:
# a+b a/b a**b
# 这和上面都不会修改原来的对象
 

数组的索引

In [49]:
# 一维数组的切片与列表相同
a = np.arange(15).reshape((3,5)) # 将一个一维数组转换为3行5列的二维数组
a
Out[49]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
In [50]:
a[1][2],a[1,2] # 两种写法取索引相同,推荐后面的写法,切片会介绍
Out[50]:
(7, 7)
In [51]:
# 要获取6,7,8,11,12,13
a[1:][1:4] # 结果并不是想要的,因为鲜切除了a[1:]再去切[1:4]两次都是切得行
Out[51]:
array([[10, 11, 12, 13, 14]])
In [52]:
a[1:,1:4] # 切行和列
Out[52]:
array([[ 6,  7,  8],
       [11, 12, 13]])
In [53]:
# 与类表不同,数组在切片时并不会自动复制,在切片数组上修改会影响原数组
a = np.arange(15)
print(a)
b = a[1:5]
print(b)
b[1]=10
print(a)
 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[1 2 3 4]
[ 0  1 10  3  4  5  6  7  8  9 10 11 12 13 14]
In [54]:
# 解决方法copy()
a = np.arange(15)
print(a)
b = a[1:5].copy()
print(b)
b[1]=10
print(a)
 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[1 2 3 4]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
 

布尔型索引

In [55]:
a = np.array([random.randint(0,10) for i in range(20)])
a
Out[55]:
array([ 1,  6,  2,  7,  1,  7,  0, 10,  7,  8, 10,  3, 10, 10,  0,  3,  9,
        0,  0,  2])
In [56]:
# 获取大于5的数
a[a>5]
Out[56]:
array([ 6,  7,  7, 10,  7,  8, 10, 10, 10,  9])
In [58]:
# 原理a>5返回一个布尔值数组,a[a>5]会将True对应的值返回
a = np.arange(5)
a
Out[58]:
array([0, 1, 2, 3, 4])
In [59]:
a[[True,True,False,False,False]]
Out[59]:
array([0, 1])
In [60]:
# 取数组中大于5,小于8的元素
a = np.array([random.randint(0,10) for i in range(20)])
a
Out[60]:
array([ 3,  6,  7,  4,  9,  8,  8,  5, 10,  6,  4,  8,  4,  2,  4,  5,  9,
        3,  9,  3])
In [61]:
a[(a>5)&(a<8)] # &优先级大于比较运算符
Out[61]:
array([6, 7, 6])
In [62]:
# 取小于5或大于8的数
a[(a<5)|(a>8)]
Out[62]:
array([ 3,  4,  9, 10,  4,  4,  2,  4,  9,  3,  9,  3])
In [63]:
# 取不小于5的数,可以用大于等于,下面用非
a[~(a<5)]
Out[63]:
array([ 6,  7,  9,  8,  8,  5, 10,  6,  8,  5,  9,  9])
 

花式索引

In [66]:
# 根据索引从数组中取值
a = np.arange(0,10,2)
print(a)
 
[0 2 4 6 8]
In [67]:
a[[3,2,1]]
Out[67]:
array([6, 4, 2])
In [69]:
# 多维数组切片与花式索引联合取值
a = np.arange(15).reshape(3,5)
print(a)
a[1:,[1,3]] # ,一定是多维数组
 
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
Out[69]:
array([[ 6,  8],
       [11, 13]])
In [70]:
# 多维数组使用两个索引取值,想要得到第0行的1和3,和第2行的0和3
a[[0,2],[1,3]] # 会去取a[0][1]和a[2][3]
Out[70]:
array([ 1, 13])
In [71]:
# 想要得到想要的结果,就要切两次,一次切全部行,一次切全部列
print(a[[0,2],:]) # 第一行和第二行
print(a[[0,2],:][:,[1,3]]) # 第一列和第三列
 
[[ 0  1  2  3  4]
 [10 11 12 13 14]]
[[ 1  3]
 [11 13]]
 

通用函数

In [72]:
# 数组转换回列表
a = np.arange(15)
print(a)
a.tolist()
 
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
Out[72]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
In [74]:
# 对数组内所有元素进行运算
a = np.arange(-10,10).reshape(4,5)
print(a)
 
[[-10  -9  -8  -7  -6]
 [ -5  -4  -3  -2  -1]
 [  0   1   2   3   4]
 [  5   6   7   8   9]]
In [75]:
# 绝对值
np.abs(a)
Out[75]:
array([[10,  9,  8,  7,  6],
       [ 5,  4,  3,  2,  1],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9]])
In [76]:
a # 本身不会发生改变
Out[76]:
array([[-10,  -9,  -8,  -7,  -6],
       [ -5,  -4,  -3,  -2,  -1],
       [  0,   1,   2,   3,   4],
       [  5,   6,   7,   8,   9]])
In [77]:
# ceil,f loor,rint,trunc 小数转化成整数
a = np.arange(-10.1,9.1,1).reshape(4,5)
print(a)
 
[[-10.1  -9.1  -8.1  -7.1  -6.1]
 [ -5.1  -4.1  -3.1  -2.1  -1.1]
 [ -0.1   0.9   1.9   2.9   3.9]
 [  4.9   5.9   6.9   7.9   8.9]]
In [78]:
np.trunc(a)
Out[78]:
array([[-10.,  -9.,  -8.,  -7.,  -6.],
       [ -5.,  -4.,  -3.,  -2.,  -1.],
       [ -0.,   0.,   1.,   2.,   3.],
       [  4.,   5.,   6.,   7.,   8.]])
In [79]:
np.round(a)
Out[79]:
array([[-10.,  -9.,  -8.,  -7.,  -6.],
       [ -5.,  -4.,  -3.,  -2.,  -1.],
       [ -0.,   1.,   2.,   3.,   4.],
       [  5.,   6.,   7.,   8.,   9.]])
In [80]:
# isnan isinf
float("nan"),float("inf")
Out[80]:
(nan, inf)
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 # 给出了警告,但没有抛出异常
 
c:\python36\lib\site-packages\ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in true_divide
  """
Out[81]:
array([ 1.,  2.,  3.,  4., inf])
In [82]:
a = np.array([1,2,3,4,0])
b = np.array([1,1,1,1,0])
a/b
 
c:\python36\lib\site-packages\ipykernel_launcher.py:3: RuntimeWarning: invalid value encountered in true_divide
  This is separate from the ipykernel package so we can avoid doing imports until
Out[82]:
array([ 1.,  2.,  3.,  4., nan])
In [83]:
# nan表示数据的缺失值
# 过滤缺失值
c = a/b
np.isnan(c)
 
c:\python36\lib\site-packages\ipykernel_launcher.py:3: RuntimeWarning: invalid value encountered in true_divide
  This is separate from the ipykernel package so we can avoid doing imports until
Out[83]:
array([False, False, False, False,  True])
In [84]:
c[~np.isnan(c)]
Out[84]:
array([1., 2., 3., 4.])
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]:
array([2, 3, 4, 5])
In [92]:
np.minimum(a,b) # 选小的
Out[92]:
array([1, 2, 3, 4])
 

数学和统计方法

In [93]:
# sum 求和
a.sum()
Out[93]:
10
In [94]:
# 求平均数
a.mean()
Out[94]:
2.5
In [95]:
# max 最大值
a.max()
Out[95]:
4
In [96]:
# min 最小值
a.min()
Out[96]:
1
In [97]:
# argmax 最大值得下标
a.argmax()
Out[97]:
3
In [98]:
# argmin 最小值的下标
a.argmin()
Out[98]:
0
In [99]:
# std 求标准差
a.std()
Out[99]:
1.118033988749895
In [100]:
# var 求方差
a.var()
Out[100]:
1.25
 

随机数生成

In [101]:
# randint #返回随机整数
np.random.randint(10,20)
Out[101]:
19
In [102]:
# 可以返回一个随机数组
np.random.randint(10,20,10)
Out[102]:
array([16, 13, 12, 19, 14, 19, 14, 12, 17, 13])
In [103]:
np.random.randint(10,20,(3,5)) #返回一个多维数组
Out[103]:
array([[11, 16, 16, 13, 15],
       [13, 14, 15, 12, 19],
       [19, 18, 11, 15, 13]])
In [3]:
#  rand() 返回0-1之间的
np.random.rand()
Out[3]:
0.2919743775419522
In [4]:
np.random.rand(10) # 返回一个数组
Out[4]:
array([0.06348917, 0.4307216 , 0.12689592, 0.9476617 , 0.79151248,
       0.55674249, 0.04878794, 0.87764869, 0.7086923 , 0.45522522])
In [6]:
np.random.rand(3,5) # 返回多维数组
Out[6]:
array([[0.49350684, 0.69451215, 0.05057905, 0.21075956, 0.34050661],
       [0.8315033 , 0.51436601, 0.62333985, 0.42244011, 0.00271942],
       [0.01576632, 0.02959323, 0.8348931 , 0.53198371, 0.59958076]])
In [7]:
# choice 随机选择一个
np.random.choice([1,2,3,4,5,6,7,8])
Out[7]:
5
In [8]:
np.random.choice([1,2,3,4,5,6,7,8],4) #抽取4个
Out[8]:
array([5, 7, 5, 4])
In [10]:
np.random.choice([1,2,3,4,5,6,7,8],(2,2)) #抽取2*2的二维数组
Out[10]:
array([[3, 6],
       [6, 7]])
In [11]:
# shuffle 打乱原数组的顺序
a = np.random.rand(3,5)
a
Out[11]:
array([[0.38825244, 0.13464197, 0.96568552, 0.96759176, 0.68511018],
       [0.99466023, 0.85993706, 0.64633703, 0.78205937, 0.03947689],
       [0.74921786, 0.87508356, 0.69101657, 0.11053689, 0.81210903]])
In [12]:
np.random.shuffle(a)
In [13]:
a
Out[13]:
array([[0.74921786, 0.87508356, 0.69101657, 0.11053689, 0.81210903],
       [0.38825244, 0.13464197, 0.96568552, 0.96759176, 0.68511018],
       [0.99466023, 0.85993706, 0.64633703, 0.78205937, 0.03947689]])
In [14]:
# uniform 返回随机小数
np.random.uniform(10)  # 0-10
Out[14]:
7.628613871655429
In [16]:
np.random.uniform(-10,1) # 指定范围-10-1
Out[16]:
-3.625279952569654
In [17]:
np.random.uniform(-10,1,10) # 10个
Out[17]:
array([-9.106866  , -4.48231946, -5.939095  ,  0.37191592, -4.33983847,
       -1.53960275, -0.63881889, -9.66113326, -4.50775089, -8.5409844 ])
In [18]:
np.random.uniform(-10,1,(3,3)) # 3*3的二维数组
Out[18]:
array([[-2.61981005, -0.75141144, -6.91082529],
       [-6.99393603, -5.02461671, -2.31880605],
       [ 0.23975243, -1.91707067, -9.7963657 ]])
posted @ 2018-03-28 08:05  瓜田月夜  阅读(322)  评论(0编辑  收藏  举报