numpy学习笔记
文章目录
numpy为python一个功能强大的数组
安装:pip3 install numpy
导入方法:import numpy as np
numpy数组和python list数组区别
列表和数组区别:
1.数组元素类型必须相同
2.数组大小不可修改
创建数组的方法
创建numpy有很多方法,具体如下
# 直接传入列表初始化
In [30]: np.array([1,2])
Out[30]: array([1, 2])
# 初始化10个0.0浮点数,默认创建的元素是浮点型
In [31]: np.zeros(10)
Out[31]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# 创建10个int类型0,使用int_是为了与python自带的int关键字做区分
In [32]: np.zeros(10,dtype='int_')
Out[32]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# 创建10个1浮点数
In [33]: np.ones(10)
Out[33]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 申请10个数据空间,并不初始化他们
In [34]: np.empty(10)
Out[34]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 创建100个元素,从0开始枚举
In [37]: np.arange(100)
Out[37]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
# 以[2,100),步进0.5方式创建数组
In [38]: np.arange(2,100,0.5)
Out[38]:
array([ 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,
7.5, 8. , 8.5, 9. , 9.5, 10. , 10.5, 11. , 11.5, 12. , 12.5,
13. , 13.5, 14. , 14.5, 15. , 15.5, 16. , 16.5, 17. , 17.5, 18. ,
18.5, 19. , 19.5, 20. , 20.5, 21. , 21.5, 22. , 22.5, 23. , 23.5,
24. , 24.5, 25. , 25.5, 26. , 26.5, 27. , 27.5, 28. , 28.5, 29. ,
29.5, 30. , 30.5, 31. , 31.5, 32. , 32.5, 33. , 33.5, 34. , 34.5,
35. , 35.5, 36. , 36.5, 37. , 37.5, 38. , 38.5, 39. , 39.5, 40. ,
40.5, 41. , 41.5, 42. , 42.5, 43. , 43.5, 44. , 44.5, 45. , 45.5,
46. , 46.5, 47. , 47.5, 48. , 48.5, 49. , 49.5, 50. , 50.5, 51. ,
51.5, 52. , 52.5, 53. , 53.5, 54. , 54.5, 55. , 55.5, 56. , 56.5,
57. , 57.5, 58. , 58.5, 59. , 59.5, 60. , 60.5, 61. , 61.5, 62. ,
62.5, 63. , 63.5, 64. , 64.5, 65. , 65.5, 66. , 66.5, 67. , 67.5,
68. , 68.5, 69. , 69.5, 70. , 70.5, 71. , 71.5, 72. , 72.5, 73. ,
73.5, 74. , 74.5, 75. , 75.5, 76. , 76.5, 77. , 77.5, 78. , 78.5,
79. , 79.5, 80. , 80.5, 81. , 81.5, 82. , 82.5, 83. , 83.5, 84. ,
84.5, 85. , 85.5, 86. , 86.5, 87. , 87.5, 88. , 88.5, 89. , 89.5,
90. , 90.5, 91. , 91.5, 92. , 92.5, 93. , 93.5, 94. , 94.5, 95. ,
95.5, 96. , 96.5, 97. , 97.5, 98. , 98.5, 99. , 99.5])
# 以[0,100]切101份的方式创建数组
In [39]: np.linspace(0,100,101)
Out[39]:
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.,
11., 12., 13., 14., 15., 16., 17., 18., 19., 20., 21.,
22., 23., 24., 25., 26., 27., 28., 29., 30., 31., 32.,
33., 34., 35., 36., 37., 38., 39., 40., 41., 42., 43.,
44., 45., 46., 47., 48., 49., 50., 51., 52., 53., 54.,
55., 56., 57., 58., 59., 60., 61., 62., 63., 64., 65.,
66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76.,
77., 78., 79., 80., 81., 82., 83., 84., 85., 86., 87.,
88., 89., 90., 91., 92., 93., 94., 95., 96., 97., 98.,
99., 100.])
numpy快速运算
numpy数组和numpy数组,数值做加减乘除运算
#numpy数组和数字做运算相当于数组每一个元素分别和数字进行运算
In [15]: a = np.array([1,2,3])
In [16]: b = 3.5
In [17]: a * b
Out[17]: array([ 3.5, 7. , 10.5])
#numpy数组和numpy数组做运算相当于两个数组每一个元素分别进行运算
In [18]: a = np.array([1,2,3])
...: b = np.array([6,7,8])
...: a * b
Out[18]: array([ 6, 14, 24])
# 可以拿数组和数字进行比较,返回数组内每个元素与数字比较的结果,即布尔值数组
In [43]: a > 10
Out[43]: array([False, False, False])
# 可以拿数组和数组进行比较,返回两个数组内每个元素之间比较的结果
In [45]: a < b
Out[45]: array([ True, True, True])
numpy索引
numpy数组的索引更方便也更强大,具体如下
In [46]: a = np.array([[1,2,3],[4,5,6]])
# 获取第一行
In [47]: a[0]
Out[47]: array([1, 2, 3])
# 获取第一行第一列
In [48]: a[0][0]
Out[48]: 1
# 获取第一行第一列,numpy独有的方式
In [49]: a[0,0]
Out[49]: 1
# 获取第一行,numpy独有的方式
In [50]: a[0,:]
Out[50]: array([1, 2, 3])
# 布尔索引 取a>2的所有元素
In [77]: a[a >2]
Out[77]: array([3, 4, 5, 6])
# 首先 a > 2 这个表达式会返回一个布尔索引
In [78]: a > 2
Out[78]:
array([[False, False, True],
[ True, True, True]])
# 其次索引可以为一个布尔列表,会提取为True的元素
In [79]: a[[[False, False, True],[ True, True, True]]]
Out[79]: array([3, 4, 5, 6])
# 取a中所有大于2,且为偶数的元素
In [80]: a[(a > 2) & (a % 2 == 0)]
Out[80]: array([4, 6])
# 可以同时取多个元素,这里取(0,0)和(0,2)两个位置的元素
In [90]: a[0,[0,2]]
Out[90]: array([1, 3])
In [96]: a = np.arange(15).reshape((3,5))
In [97]: a
Out[97]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 取第二行到第三行和第二列到第三列上的元素
In [98]: a[[1,2],:][:,[1,2]]
Out[98]:
array([[ 6, 7],
[11, 12]])
numpy切片
numpy所有切片操作均为引用操作,和list列表不同的是,list列表切片会复制原列表中的元素组成新列表
但是numpy数组切片是原数组的引,也就是说改变原数组的元素也会影响新数组中的值
不过可以使用copy操作复制numpy数组的值
例如
In [53]: a = np.arange(10)
In [54]: a
Out[54]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [55]: b = a[0:4]
# 修改a数组的值
In [56]: a[3] = 100
In [57]: a
Out[57]: array([ 0, 1, 2, 100, 4, 5, 6, 7, 8, 9])
#b数组的值也会改变,也就相当于b数据只记录a数组元素的位置,并没有记录a数组的值
In [58]: b
Out[58]: array([ 0, 1, 2, 100])
# 使用copy可以复制一份a数组的值,使其修改互不影响
In [66]: c = a[7:].copy()
In [68]: c[2] = 100
In [69]: c
Out[69]: array([ 7, 8, 100])
In [70]: a
Out[70]: array([ 0, 1, 2, 100, 4, 5, 6, 7, 8, 8])
In [73]: a = np.arange(15).reshape((3,5))
In [74]: a
Out[74]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 获取[0,2)行[0,2)列元素,也就是第0,1行和第0,1列的元素
In [75]: a[0:2,0:2]
Out[75]:
array([[0, 1],
[5, 6]])
numpy属性
a.dtype数据类型
对数组使用dtype就可以查询到数组元素的类型
具体有:布尔型,整型,无符号整形,浮点型,复数型
In [23]: a = np.array([[1,2,3],[4,5,6]])
In [24]: a.dtype
Out[24]: dtype('int64')
a.size 当前存储的元素个数
In [25]: a.size
Out[25]: 6
a.shape 返回元素的维度信息(几行几列)
In [26]: a.shape
Out[26]: (2, 3)
a.T 反转行列
In [27]: a.T
Out[27]:
array([[1, 4],
[2, 5],
[3, 6]])
a.ndim 查看当前维数
In [28]: a.ndim
Out[28]: 2
reshape重新改变数组的维度,传入维度元素
# 将15个元素一维数组变成3行5列二维数组
In [73]: a = np.arange(15).reshape((3,5))
In [74]: a
Out[74]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
numpy函数
数组可以使用常见的数学函数
一元函数:abs,sqrt,exp,log,ceil,floor,rint,trunc,modf,isnan,isinf,cos,sin,tan
二元函数:add,substract,multiply,divide,power,mod,maximum,mininum
一元函数例子:
# 1.abs绝对值
In [105]: a = np.arange(-5,5)
In [106]: a
Out[106]: array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4])
In [107]: np.abs(a)
Out[107]: array([5, 4, 3, 2, 1, 0, 1, 2, 3, 4])
# 2.sqrt开方
In [151]: c = np.sqrt(a)
<ipython-input-151-3a71ac760add>:1: RuntimeWarning: invalid value encountered in sqrt
c = np.sqrt(a)
In [152]: c
Out[152]:
array([ nan, nan, nan, nan, nan,
0. , 1. , 1.41421356, 1.73205081, 2. ])
# 负数部分开方会报错,故返回的是nan
# 3.判断一个数是否为nan,必须使用isnan()方式判断,不能使用np.nan和float('nan')
In [153]: np.isnan(c)
Out[153]:
array([ True, True, True, True, True, False, False, False, False,
False])
# nan代表这个数字不为数字类型,也就不等于任何值
In [155]: np.nan == np.nan
Out[155]: False
In [156]: float('nan')
Out[156]: nan
# 4. inf代表这个数为无限大,比任何浮点数都大
In [160]: d = 1 / a
<ipython-input-160-cb93115ea47a>:1: RuntimeWarning: divide by zero encountered in divide
d = 1 / a
In [161]: d
Out[161]:
array([-0.2 , -0.25 , -0.33333333, -0.5 , -1. ,
inf, 1. , 0.5 , 0.33333333, 0.25 ])
# 可以使用isinf()来判断是否为无限大
In [162]: np.isinf(d)
Out[162]:
array([False, False, False, False, False, True, False, False, False,
False])
# 也可以使用float('inf')和np.inf表示无限大,他们是相等的
In [163]: float('inf') == np.inf
Out[163]: True
# 5.获取不为inf的元素,我们可以使用~做取反操作
In [165]: d[~(np.isinf(d))]
Out[165]:
array([-0.2 , -0.25 , -0.33333333, -0.5 , -1. ,
1. , 0.5 , 0.33333333, 0.25 ])
# 6.np.random.random返回随机数[0,1),可以传入个数size ,如下获取[-5,5]之间的随机数
In [140]: a = np.random.random(10) * 10 - 5
In [141]: a
Out[141]:
array([-4.5263441 , -4.75086344, -2.87959803, 0.58042132, 3.01278884,
-2.64453772, -2.65748463, -4.58984137, -2.3209378 , 4.70287731])
# 7.向上取整,取比他大的最接近他的整数
In [142]: np.ceil(a)
Out[142]: array([-4., -4., -2., 1., 4., -2., -2., -4., -2., 5.])
# 8.向下取整,取比他小的最接近他的整数
In [143]: np.floor(a)
Out[143]: array([-5., -5., -3., 0., 3., -3., -3., -5., -3., 4.])
# 9.四舍五入
In [144]: np.round(a)
Out[144]: array([-5., -5., -3., 1., 3., -3., -3., -5., -2., 5.])
# 10.截位取整,往接近0的地方取
In [145]: np.trunc(a)
Out[145]: array([-4., -4., -2., 0., 3., -2., -2., -4., -2., 4.])
# 11.截位取整,往远离0的地方取
In [147]: np.rint(a)
Out[147]: array([-5., -5., -3., 1., 3., -3., -3., -5., -2., 5.])
# 12.截位取小数部分
In [146]: np.modf(a)
Out[146]:
(array([-0.5263441 , -0.75086344, -0.87959803, 0.58042132, 0.01278884,
-0.64453772, -0.65748463, -0.58984137, -0.3209378 , 0.70287731]),
array([-4., -4., -2., 0., 3., -2., -2., -4., -2., 4.]))
二元函数例子
In [173]: a = np.random.randint(0,10,5)
In [174]: a
Out[174]: array([2, 7, 3, 3, 9])
In [175]: b = np.random.randint(0,10,5)
In [176]: b
Out[176]: array([8, 4, 2, 1, 3])
# 1.maximum分别取多个数组每个索引上最大的那个元素,组成新数组。
# 下面是取(a1,b1)中最大的一个,(a2,b2)中最大的一个...(an,bn)中最大的一个
In [178]: np.maximum(a,b)
Out[178]: array([8, 7, 3, 3, 9])
# 2.minimum分别取多个数组每个索引上最小的那个元素,组成新数组。
In [179]: np.minimum(a,b)
Out[179]: array([2, 4, 2, 1, 3])
# 3.sum求数组和
In [182]: a.sum()
Out[182]: 24
# 4.mean求平均值
In [183]: a.mean()
Out[183]: 4.8
# 5.var求方差
In [184]: a.var()
Out[184]: 7.359999999999999
# 6.std求标准差
In [185]: a.std()
Out[185]: 2.7129319932501073
# 7.max求最大值
In [186]: a.max()
Out[186]: 9
# 8.min求最小值
In [187]: a.min()
Out[187]: 2
# 9.argmax求最大值索引
In [188]: a.argmax()
Out[188]: 4
# 10.argmin求最小值索引
In [189]: a.argmin()
Out[189]: 0
随机数
# 1.np.random.random生成[0,1)之间随机浮点数,传入维度
In [194]: np.random.random(10)
Out[194]:
array([0.40253336, 0.6395545 , 0.77343554, 0.49709943, 0.2379541 ,
0.60229773, 0.46475173, 0.85434757, 0.98213081, 0.15102127])
In [195]: np.random.random((3,5))
Out[195]:
array([[1.44734234e-01, 4.72917858e-01, 4.73867377e-01, 9.38570204e-01,
7.69834357e-01],
[3.43774042e-04, 8.45103984e-01, 1.78201726e-01, 6.07460480e-01,
7.05158045e-01],
[8.78095722e-01, 7.62481569e-02, 3.15812707e-01, 2.14805695e-01,
8.89115012e-01]])
# 2.np.random.rand生成[0,1)之间均匀分布随机浮点数,传入维度
In [204]: np.random.rand(3,5)
Out[204]:
array([[0.8353319 , 0.90417658, 0.3975569 , 0.68508979, 0.36636548],
[0.50636544, 0.77503486, 0.96602863, 0.41467861, 0.70663033],
[0.01870399, 0.05769704, 0.01059864, 0.21807824, 0.29163511]])
# 3.np.random.randn生成[0,1)之间正态分布随机浮点数,传入维度
In [205]: np.random.randn(10)
Out[205]:
array([-0.39148467, 0.50209571, -0.95978873, -0.95632344, 0.32941717,
0.55680481, -1.74422017, 1.94657026, 0.13936672, 1.79287539])
# 4.从[1,2,3,4,5]数组里抽10次,将其结果存入新数组中
In [206]: np.random.choice([1,2,3,4,5],10)
Out[206]: array([5, 4, 2, 5, 1, 1, 5, 3, 3, 1])
In [207]: np.random.choice([1,2,3,4,5],(3,5))
Out[207]:
array([[4, 5, 4, 1, 4],
[4, 3, 4, 4, 4],
[1, 3, 5, 5, 2]])
# 5.从[2.0,5.0)随机生成10个数组成新数组
In [208]: np.random.uniform(2.0,5.0,10)
Out[208]:
array([2.43132689, 4.10560096, 4.38615811, 4.79349529, 4.22197211,
2.75260906, 3.19279383, 3.8108772 , 3.34138134, 4.59996023])
In [209]: np.random.uniform(2.0,5.0,(2,3))
Out[209]:
array([[3.71515589, 2.26900234, 3.01963218],
[4.23468968, 3.35825006, 2.93499777]])