2.numpy矩阵简单使用

àì夳堔傛蜴生んèń 2022-12-27 08:48 268阅读 0赞

2.numpy矩阵

numpy创建数组(矩阵)

  1. 创建数组

    创建数组

    a = np.array([i for i in range(1, 6)])
    b = np.array(range(1, 6))
    c = np.arange(1, 6)

    a = b = c

    arange([start,] stop[, step,], dtype=None)

    print(a, b, c)

    数组的类名

    print(type(a))

    数组的类型

    print(a.dtype)

  2. 数据类型的操作

    数据类型的操作

    指定创建数组类型

    a=np.array([0,1,0,1], dtype=np.bool)
    print(a)

    修改数组类型

    b = a.astype(“int”)
    print(b)

    a=np.array([0,1,0,1], dtype=int)
    b = a.astype(“float”)
    print(a)
    print(b)

    修改浮点型的小数位数

    a = np.array([i/123 for i in range(1, 10)], dtype=np.float)
    print(a)
    b = np.round(a, 2)
    print(b)

  3. 数组的形状

    a = np.array([[i for i in range(1, 6)], [i for i in range(6, 11)]], dtype=np.int)
    print(a)

    查看数组的形状

    print(a.shape)

    (2, 5)

    修改数组的形状

    b = a.reshape(5, 2)
    print(b)

    把数组转换为一维数据

    c = b.reshape(1, 10)
    print(c)
    print(list(b.flatten()))
    print([*b.flat])
    print(b.ravel())

  4. 数组和数的计算

    数组和数的计算

    a = np.array([[i for i in range(3, 9)], [i for i in range(4, 10)]], dtype=np.int)

    加减

    print(a)
    print(a+1)

    乘除

    print(a*3)

    numpy 广播机制造成的,在运算过程中,加减乘除的值被广播到所有元素上面

    print(a[0]*3)

  5. 数组和数组的计算

    import numpy as np

    数组和数组的计算

    a = np.array([[i for i in range(3, 9)], [i for i in range(4, 10)]], dtype=np.int)

    b = np.array([[i for i in range(13, 19)], [i for i in range(14, 20)]], dtype=np.int)

    多行与多行,行数相同,多列与多列,列数相同

    加减

    print(a+b)

    乘除

    print(a*b)

    多行与多行,行数相同,多列与多列,列数不同

    c = np.array([[i for i in range(13, 18)], [i for i in range(14, 19)]], dtype=np.int)

    print(a*c)

    单行与多行,行数不同,多列与多列,列数相同

    d = np.array([i for i in range(1, 7)])
    print(a-d)
    print(a*d)

    多行与多行,行数相同,单列与多列,列数不同

    e = np.array([[i for i in range(1, 2)], [i for i in range(2, 3)]])
    print(a+e)
    print(a*e)

  6. 广播原则> 如果两个数组的后缘维度(从末尾开始算起的维度)的轴长度相符其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失维度和(或)轴长度为1的维度上进行。

怎么理解呢?
可以把维度指的是shape所对应的数字个数
那么问题来了:
shape为(3,3,3)的数组能够和(3,2)的数组进行计算么?
shape为(3,3,2)的数组能够和(3,2)的数组进行计算么?
有什么好处呢?
举个例子:每列的数据减去列的平均值的结果

  1. 轴(axis)> 在numpy中可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴

有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值
那么问题来了:
在前面的知识,轴在哪里?
回顾np.arange(0,10).reshape((2,5)),reshpe中2表示0轴长度(包含数据的条数)为2,1轴长度为5,2X5一共10个数据

二维数组的轴
![image.png](https://img-blog.csdnimg.cn/img\_convert/38525552048b55beeb5a8bcb83371c4d.png\#align=left&display=inline&height=402&margin=\[object Object]&name=image.png&originHeight=402&originWidth=504&size=115247&status=done&style=none&width=504)
三维数组的轴
![image.png](https://img-blog.csdnimg.cn/img\_convert/5acc441bcaa5322a72468c8d166f3e81.png\#align=left&display=inline&height=457&margin=\[object Object]&name=image.png&originHeight=457&originWidth=750&size=166739&status=done&style=none&width=750)

numpy 读取数据

CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的

  1. np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)

![image.png](https://img-blog.csdnimg.cn/img\_convert/ca74f2b5babddb824e53b17169ac0b51.png\#align=left&display=inline&height=326&margin=\[object Object]&name=image.png&originHeight=326&originWidth=684&size=62702&status=done&style=none&width=684)

![image.png](https://img-blog.csdnimg.cn/img\_convert/3426cbd9145e11193bb6a894199b2352.png\#align=left&display=inline&height=310&margin=\[object Object]&name=image.png&originHeight=310&originWidth=760&size=115091&status=done&style=none&width=760)

假设现在我们有一组从2006年到2016年1000部最流行的电影数据,我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data

1. numpy中的转置

转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据

  1. In [7]: t = np.array([i for i in range(18)]).reshape(3, 6)
  2. In [8]: t
  3. Out[8]:
  4. array([[ 0, 1, 2, 3, 4, 5],
  5. [ 6, 7, 8, 9, 10, 11],
  6. [12, 13, 14, 15, 16, 17]])
  7. In [9]: t.transpose()
  8. Out[9]:
  9. array([[ 0, 6, 12],
  10. [ 1, 7, 13],
  11. [ 2, 8, 14],
  12. [ 3, 9, 15],
  13. [ 4, 10, 16],
  14. [ 5, 11, 17]])
  15. In [11]: t.swapaxes(1, 0)
  16. Out[11]:
  17. array([[ 0, 6, 12],
  18. [ 1, 7, 13],
  19. [ 2, 8, 14],
  20. [ 3, 9, 15],
  21. [ 4, 10, 16],
  22. [ 5, 11, 17]])
  23. In [12]: t.T
  24. Out[12]:
  25. array([[ 0, 6, 12],
  26. [ 1, 7, 13],
  27. [ 2, 8, 14],
  28. [ 3, 9, 15],
  29. [ 4, 10, 16],
  30. [ 5, 11, 17]])

numpy 索引和切片

  1. In [16]: t
  2. Out[16]:
  3. array([[ 0, 1, 2, 3, 4, 5],
  4. [ 6, 7, 8, 9, 10, 11],
  5. [12, 13, 14, 15, 16, 17]])
  6. In [17]: t[1] # 取一行
  7. Out[17]: array([ 6, 7, 8, 9, 10, 11])
  8. In [18]: t[:,2] # 取一列
  9. Out[18]: array([ 2, 8, 14])
  10. In [19]: t[1:3] # 取多行
  11. Out[19]:
  12. array([[ 6, 7, 8, 9, 10, 11],
  13. [12, 13, 14, 15, 16, 17]])
  14. In [20]: t[:, 1:3] # 取多列
  15. Out[20]:
  16. array([[ 1, 2],
  17. [ 7, 8],
  18. [13, 14]])
  19. In [21]: t[:, [1,3]] 取特定的多列
  20. Out[21]:
  21. array([[ 1, 3],
  22. [ 7, 9],
  23. [13, 15]])
  24. In [22]: t[[1,2]] # 取特定的多行
  25. Out[22]:
  26. array([[ 6, 7, 8, 9, 10, 11],
  27. [12, 13, 14, 15, 16, 17]])

numpy中数值的修改

  1. In [23]: t
  2. Out[23]:
  3. array([[ 0, 1, 2, 3, 4, 5],
  4. [ 6, 7, 8, 9, 10, 11],
  5. [12, 13, 14, 15, 16, 17]])
  6. In [24]: t[:, 2:4] = 0
  7. In [25]: t
  8. Out[25]:
  9. array([[ 0, 1, 0, 0, 4, 5],
  10. [ 6, 7, 0, 0, 10, 11],
  11. [12, 13, 0, 0, 16, 17]])
  12. # 布尔索引
  13. In [26]: t=np.arange(24).reshape((4,6))
  14. In [27]: t
  15. Out[27]:
  16. array([[ 0, 1, 2, 3, 4, 5],
  17. [ 6, 7, 8, 9, 10, 11],
  18. [12, 13, 14, 15, 16, 17],
  19. [18, 19, 20, 21, 22, 23]])
  20. In [28]: t<10
  21. Out[28]:
  22. array([[ True, True, True, True, True, True],
  23. [ True, True, True, True, False, False],
  24. [False, False, False, False, False, False],
  25. [False, False, False, False, False, False]])
  26. In [29]: t[t<10]=0
  27. In [30]: t
  28. Out[30]:
  29. array([[ 0, 0, 0, 0, 0, 0],
  30. [ 0, 0, 0, 0, 10, 11],
  31. [12, 13, 14, 15, 16, 17],
  32. [18, 19, 20, 21, 22, 23]])
  33. # numpy中三元运算符
  34. In [32]: t=np.arange(24).reshape((4,6))
  35. In [33]: t
  36. Out[33]:
  37. array([[ 0, 1, 2, 3, 4, 5],
  38. [ 6, 7, 8, 9, 10, 11],
  39. [12, 13, 14, 15, 16, 17],
  40. [18, 19, 20, 21, 22, 23]])
  41. In [34]: np.where(t<10, 0, 10)
  42. Out[34]:
  43. array([[ 0, 0, 0, 0, 0, 0],
  44. [ 0, 0, 0, 0, 10, 10],
  45. [10, 10, 10, 10, 10, 10],
  46. [10, 10, 10, 10, 10, 10]])
  47. In [57]: t=np.arange(24).reshape((4,6))
  48. # numpy中的clip(裁剪)
  49. In [58]: t.clip(10, 18)
  50. Out[58]:
  51. array([[10, 10, 10, 10, 10, 10],
  52. [10, 10, 10, 10, 10, 11],
  53. [12, 13, 14, 15, 16, 17],
  54. [18, 18, 18, 18, 18, 18]])
  55. In [59]:

numpy中的nan和inf

nan(NAN,Nan):not a number表示不是一个数字
什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

1. numpy中的nan的注意点

  1. 两个nan不相等

    In [1]: import numpy as np

    In [2]: np.nan==nap.nan

    NameError Traceback (most recent call last)
    in
    ——> 1 np.nan==nap.nan

    NameError: name ‘nap’ is not defined
    In [7]: np.nan!=np.nan
    Out[7]: True

  2. 判断nan的个数```
    In [13]: t=np.array([1, 2, np.nan])

In [14]: np.count_nonzero(t!=t)

  1. 3. 判断nan```
  2. In [12]: t=np.array([1, 2, np.nan])
  3. In [15]: t[np.isnan(t)]=0
  4. In [16]: t
  5. Out[16]: array([1., 2., 0.])
  1. nan和任何值计算都为nan
    nan 填充均值

    t中存在nan值,如何操作把其中的nan填充为每一列的均值

    import numpy as np
    t = np.array([[ 0., 1., 2., 3., 4., 5.],

    1. [ 6., 7., np.nan, 9., 10., 11.],
    2. [ 12., 13., np.nan, np.nan, np.nan, 17.],
    3. [ 18., 19., 20., 21., 22., 23.]])

    print(t.shape)

    def fill_nan_by_column_mean(t):

    1. for i in range(t.shape[1]):
    2. nan_num = np.count_nonzero(t[:, i][t[:, i] != t[:, i]]) # 计算非nan的个数
    3. if nan_num > 0:
    4. now_col = t[:, i]
    5. now_col_not_nan = now_col[np.isnan(now_col)==False].sum()
    6. now_col_mean = now_col_not_nan/(t.shape[0]-nan_num)
    7. now_col[np.isnan(now_col)] = now_col_mean
    8. t[:, i] = now_col
    9. print(t)

    fill_nan_by_column_mean(t)

numpy中常用统计函数

  1. 求和:t.sum(axis=None)
  2. 均值:t.mean(a,axis=None) 受离群点的影响较大
  3. 中值:np.median(t,axis=None)
  4. 最大值:t.max(axis=None)
  5. 最小值:t.min(axis=None)
  6. 极值:np.ptp(t,axis=None) 即最大值和最小值只差
  7. 标准差:t.std(axis=None) ==样本标准差

标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值
反映出数据的波动稳定情况,越大表示波动越大,约不稳定

默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

数据组的拼接

  1. In [30]: t1 = np.arange(0, 12).reshape((2, 6))
  2. In [31]: t2 = np.arange(12, 24).reshape((2, 6))
  3. In [32]: t1
  4. Out[32]:
  5. array([[ 0, 1, 2, 3, 4, 5],
  6. [ 6, 7, 8, 9, 10, 11]])
  7. In [33]: t2
  8. Out[33]:
  9. array([[12, 13, 14, 15, 16, 17],
  10. [18, 19, 20, 21, 22, 23]])
  11. In [34]: np.vstack((t1, t2)) # 垂直拼接 行拼接
  12. Out[34]:
  13. array([[ 0, 1, 2, 3, 4, 5],
  14. [ 6, 7, 8, 9, 10, 11],
  15. [12, 13, 14, 15, 16, 17],
  16. [18, 19, 20, 21, 22, 23]])
  17. In [35]: np.hstack((t1, t2)) # 水平拼接 列拼接
  18. Out[35]:
  19. array([[ 0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17],
  20. [ 6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23]])
  21. In [36]:

数组的行列交换

  1. In [50]: t2 = np.arange(12, 24).reshape((3, 4))
  2. In [51]: t2
  3. Out[51]:
  4. array([[12, 13, 14, 15],
  5. [16, 17, 18, 19],
  6. [20, 21, 22, 23]])
  7. In [52]: t2[[1,2], :] = t2[[2,1], :]
  8. In [53]: t2
  9. Out[53]:
  10. array([[12, 13, 14, 15],
  11. [20, 21, 22, 23],
  12. [16, 17, 18, 19]])
  13. In [55]: t2[:, [0,2]]=t2[:,[2,0]]
  14. In [56]: t2
  15. Out[56]:
  16. array([[14, 13, 12, 15],
  17. [22, 21, 20, 23],
  18. [18, 17, 16, 19]])

numpy更多好用的方法

  1. 获取最大值最小值的位置

    1. np.argmax(t,axis=0)获取每一列的最大值得位置
    2. np.argmin(t,axis=1)
  2. 创建一个全0的数组: np.zeros((3,4))
  3. 创建一个全1的数组:np.ones((3,4))
  4. 创建一个对角线为1的正方形数组(方阵):np.eye(3)

numpy生成随机数

![image.png](https://img-blog.csdnimg.cn/img\_convert/4c57e78a473f2d7e3061743d12a86acc.png\#align=left&display=inline&height=612&margin=\[object Object]&name=image.png&originHeight=612&originWidth=1206&size=200855&status=done&style=none&width=1206)

numpy的注意点copy和view

  1. a=b 完全不复制,a和b相互影响
  2. a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
  3. a = b.copy(),复制,a和b互不影响

发表评论

表情:
评论列表 (有 0 条评论,268人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Numpy(三)矩阵

    1、矩阵的创建 (1) 在创建矩阵的专用字符串中,矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开。 (2) 用T属性获取转置矩阵 mat函数创建

    相关 numpy矩阵

    矩阵 使用 `mat` 方法将 `2` 维数组转化为矩阵: ![70][] 也可以使用 Matlab 的语法传入一个字符串来生成矩阵: ![70 1][] 利用分