numpy学习笔记

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]])
相关推荐
Komorebi.py8 分钟前
【Linux】-学习笔记03
linux·笔记·学习
程序员劝退师_43 分钟前
Kafka学习笔记
笔记·学习·kafka
帅比九日1 小时前
【HarmonyOS NEXT】实战——登录页面
前端·学习·华为·harmonyos
李笠^_^1 小时前
Python学习------第八天
学习
Lotay_天天1 小时前
删库跑路,启动!
学习
爱吃生蚝的于勒1 小时前
C语言最简单的扫雷实现(解析加原码)
c语言·开发语言·学习·计算机网络·算法·游戏程序·关卡设计
麻花20131 小时前
WPF学习之路,控件的只读、是否可以、是否可见属性控制
服务器·前端·学习
wywcool1 小时前
JVM学习之路(5)垃圾回收
java·jvm·后端·学习
醇氧2 小时前
ab (Apache Bench)的使用
linux·学习·centos·apache