Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)

Python之Numpy,从0到掌握!

  • 前言
    • 1、本篇偏向实战,相关理论知识我会后续补充
    • 2、本人平时喜欢看函数源码,所以基本所有格式,情况都有写(没写就是源码没写)
  • NumPy介绍
  • 一、如何创建
    • 1、导入numpy库,并为了方便命名为 np
    • 2、查看版本
    • 3、创建数组
      • 通过列表创建一维数组
      • 通过列表创建二维数组
      • zeros:创建全为0 的数组
      • ones:创建全为1的数组
      • linspace:生成等差数列
      • 三维数组的理解
      • full:创建可以自定义维度 和 填充数字 的数组
      • arange:创建一维等差(元素值从0到自定义数字减一)
      • reshape:不改变数据的条件下,修改数组形状(接上面的创建一维,有笑点)
      • random.rand:创建随机二维数组
      • 创建n维随机数组
  • 二、数组运算
    • sum:数组元素累加值
    • mean:数组元素平均值
    • tile:横、纵向平铺数组
    • argsort:将元素按照行从小到大排序,返回对应位置元素的下标
    • n维数组加、减、乘、除运算
    • 矩阵乘法运算
    • .T:转置矩阵
    • linalg.inv:矩阵求逆
  • 三、索引的使用
    • 取绝对位置的元素
    • 取指定范围元素
    • 对指定范围元素进行运算
    • 获取数组中大于或小于某个确定值的数值
  • 四、元素数据类型
    • dtype:查看数据类型
    • astype:转换数据类型
  • 五 、截图

前言

1、本篇偏向实战,相关理论知识我会后续补充

2、本人平时喜欢看函数源码,所以基本所有格式,情况都有写(没写就是源码没写)

NumPy介绍

NumPy是python语言的第三方库,支持大量高维度的数组和矩阵计算,此外,numpy也针对数组提供了大量的数学函数,机器学习涉及大量对数组的变换和运算,numpy就成了必不可少的工具之一。

一、如何创建

1、导入numpy库,并为了方便命名为 np

import numpy as np

2、查看版本

np.__version__

我的是 1.21.4 版本

3、创建数组

Numpy的主要对象是多维数组ndarray。

  • 在numpy中维度叫做轴
  • 轴的个数叫做秩
    值得注意的是,numpy.array和Python 标准库 array.array 并不相同前者更为强大,这也就是我们学习 NumPy 的重要原因之一。

通过列表创建一维数组

arr1 = np.array([1,2,3])
print(arr1)

[1 2 3]

那上面的数组就是一个秩为1的数组(这里我们可以简单理解为维度),因为他只有一个轴,而且长度为3

通过列表创建二维数组

# 通过列表创建二维数组
arr2 = np.array([ [1,2,3] , [4,5,6]  ,[6,7,8] ])
print(arr2)

[[1 2 3]
 [4 5 6]
 [6 7 8]]

zeros:创建全为0 的数组

zeros:生成指定行数、列数并且全为0的n维数组
可以只写一个,那就是一维数组
zeros( (行,列))
你行列写成几维他就是几维度,下面几个函数也是,我懒,懒得都写!

zeros1 = np.zeros( (3,4))
print(zeros1)


[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

ones:创建全为1的数组

ones1 = np.ones(  (2,2,2) )
print(ones1)

[[[1. 1.]
  [1. 1.]]

 [[1. 1.]
  [1. 1.]]]   
  没怎么弄过三维的我就勉强优化一下形式,这下看得懂了是吧?:
  [
    [
        [1. 1.][1. 1.]
     ][
        [1. 1.][1. 1.]
     ]
]  

linspace:生成等差数列

左闭右闭
linspace(start,end,num)


a= np.linspace(1,10,10)
print(a)

[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]

三维数组的理解

三维数组

full:创建可以自定义维度 和 填充数字 的数组

full1 = np.full( (2,3),1 )
print(full1)


[[1 1 1]
 [1 1 1]]

arange:创建一维等差(元素值从0到自定义数字减一)

写到这的时候,真的给我整笑了,我是看别人的文章然后在自己总结,我看到这题目给我弄不会了,等差数组?难道是设置范围他自己给我生成?然后我去试了试,就是:

  • 首先:创建一维数组,变不了
  • 其次:我看了源码,他是只有一个start参数的,所以起始值定了 为0 , 我们只需要传递终止值就是,此处需注意,生成的范围减了一,和python里的range函数如出一辙!
arange1 = np.arange(5)
print(arange1)

[0 1 2 3 4]

reshape:不改变数据的条件下,修改数组形状(接上面的创建一维,有笑点)

首先,聪明的csdn友肯定会想,那怎么创建二维的等差呢?
当然可以!
那么,对应的函数是什么呢?我也不知道。
我又是看得别人文章,先给你们看他的答案:

np.arange(6).reshape(2, 3)

厉害吗?
我当时看懂了之后,我觉得,这哥们不知道是真的不懂reshape,还是把这条代码说的和上面显得更贴切一点。总结来说上面两个的代码,就是这个问题:
arange(n).reshape(a, b) 依次生成n个自然数(值域是0到n-1),并且以a行b列的数组形式显示

ok,不谈了,进入正题:

首先来看reshape函数(不改变数据的条件下,修改形状)的源码:

  1. 此处是数组名.reshape()形式
reshape(self, shape, order='C')
  • shape:你们都是知道的,就是形状,几行几列
  • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。
    来看实例:
reshape2 = np.arange(4)
reshape2 = reshape2.reshape(2,2,order='C')
print(reshape2)

[[0 1]
 [2 3]]
  1. 第二种
    菜鸟教程:numpy.reshape(arr, newshape, order=‘C’)
  • arr:要修改形状的数组
  • newshape:整数或者整数数组,新的形状应当兼容原有形状
  • order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。

实例:

reshape1 = np.reshape(np.arange(4), (2,2), order='C')
print(reshape1)

[[0 1]
 [2 3]]

好,一般的博主在现在都会跳过,但是,我不会,因为,你们真的懂order取值的概念吗?反正我是不懂,我也才学,so,我去试了试
直接给你们看代码,我把源数据变为了:

reshape1 = np.reshape(np.arange(9), (3,3), order='c')
  1. 当order为c,也就是按行时:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
  1. 为f时,也就是按列时:
[[0 3 6]
 [1 4 7]
 [2 5 8]]
  1. 为a时,也就是原顺序:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
  1. 为k时,也就是为内存中的数据:
    朋友们,源码真的是个好东西,我写成k,他就报错!
    在这里插入图片描述
    我他喵的,搜了好久,才发现reshape的源码里面是这样写得!
    在这里插入图片描述

k不在了!估计是新版的问题,我的版本是1.23.1,估计更新了,没了就更棒了~

不用我说,你们看了上面几种的对比也知道了对吧。

-----------------------------------------------------------------

看了看其他大佬的文章,我觉得我写文章写得慢,有好处也有坏处,好处是想得周到,自己不会的,想到的都会去求解,但是慢在写文章太拖沓,像在写小说一样,所以,下面的文章,我就改变一下,so,希望你们看得懂

random.rand:创建随机二维数组

np.random.rand(shape)

  • 范围: [0,1) 源码:↓
    在这里插入图片描述
np.random.rand(2, 2)

[[0.16403419 0.67808061]
 [0.04344741 0.19238262]]

创建n维随机数组

重点是随机
随机类:random
首先,满足随机的有以下函数:

  1. rand :产生n维,源码里面范围
    在这里插入图片描述

  2. random:只能产生一维,范围:在这里插入图片描述

  3. randint: 可以创建n维度,看源码:
    made。懒得给你们截图,我直接给你们源码的结论:
    randint(low, high=None, size=None, dtype=None):

  • 省略high,返回的范围:[0, low)
  • low,high都写,返回的范围:[low, high)
  • size:就是shape,形状

实例:

random2 = np.random.randint(4,size=(2,2))
random3 = np.random.rand(2,2)
random4 = np.random.random(3)


print(random2)
print("____")
print(random3)
print("____")
print(random4)


[[3 2]
 [2 0]]
____
[[0.71634611 0.22716593]
 [0.80354273 0.36203558]]
____
[0.75746996 0.56738677 0.40173797]

二、数组运算

sum:数组元素累加值

总结:
sum函数不仅可以计算数组元素累加值,而且还可以每一列or每一行单独求和。
实例:

a = np.array([[1, 2],
              [3, 4]])
print(a)
print(np.sum(a))
print(np.sum(a, axis=0)) # axis=0 表示对每一列求和

print(np.sum(a, axis=1)) # axis=0 表示对每一行求和

[[1 2]
 [3 4]]
10
[4 6]
[3 7]

mean:数组元素平均值

总结:
sum函数不仅可以计算数组元素平均值,而且还可以每一列or每一行单独求平均值。
实例

a = np.array([[1, 2],
              [3, 4]])
print(np.mean(a)) # 求取平均值
print(np.mean(a,axis=1)) # 对每一行 求取平均值
print(np.mean(a,axis=0)) # 对每一列 求取平均值

2.5
[1.5 3.5]
[2. 3.]

tile:横、纵向平铺数组

格式:tile(a,shape)
看了下源码,我英文差,就没写百分之100的情况:
简单来说,就是把 a 当作我们的元素,去构造一个 形状为shape的数组
实例

a = np.array([[1, 2],
              [3, 4]])
print( np.tile(a,2)  )
print("-----")
print( np.tile( a,(2,2) ) )

[[1 2 1 2]
 [3 4 3 4]]
-----
[[1 2 1 2]
 [3 4 3 4]
 [1 2 1 2]
 [3 4 3 4]]
  • 只有一个参数,就向右平铺,此处我就懒得说x轴 or y轴了

argsort:将元素按照行从小到大排序,返回对应位置元素的下标

源码简单不用看

实例

a = np.array([[1, 2, 3,  4],
              [8, 7, 6, 5]])
print(a.argsort(axis=-1))# axis= 1 or -1 将元素按照 行  从小到大排序,返回对应位置元素的下标
print("-------")
print(a.argsort(axis=0))# axis= 0  or -2 将元素按照 列  从小到大排序,返回对应位置元素的下标
这里的取值,1-2是我自己试出来的,网上很多都只写了-10 

[[0 1 2 3]
 [3 2 1 0]]
-------
[[0 0 0 0]
 [1 1 1 1]]

n维数组加、减、乘、除运算

这玩意我想都不用想,没看源码,不管几维度,都一样算法

  • 就是相应位置上的加减乘除而已,
  • 然后我去试了试shape不相同的情况,当其中一个是一维的时候,他会应用到另一个数组的每一行上

实例

a = np.array([[1, 2],
              [3, 4]])

b = np.array([[5, 6],
              [7, 8]])
print(a + b)
print("-"*6)
print(a - b)
print("-"*6)
print(a * b)
print("-"*6)
print(a / b)



[[ 6  8]
 [10 12]]
------
[[-4 -4]
 [-4 -4]]
------
[[ 5 12]
 [21 32]]
------
[[0.2        0.33333333]
 [0.42857143 0.5       ]]
特殊情况:
a = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])

b = np.array([1, 2, 3])
print(a + b)


[[ 2  4  6]
 [ 5  7  9]
 [ 8 10 12]]

矩阵乘法运算

矩阵部分,这里直接看例子,后面我会补充
实例

a = np.array([[1, 2],
              [3, 4]])

b = np.array([[5, 6],
              [7, 8]])

print(np.dot(a,b))


[[19 22]
 [43 50]]

.T:转置矩阵

a = np.array([[1, 2],
              [3, 4]])
print(a.T)

[[1 3]
 [2 4]]

linalg.inv:矩阵求逆

a = np.array([[1, 2],
              [3, 4]])
print(np.linalg.inv(a))


[[-2.   1. ]
 [ 1.5 -0.5]]

三、索引的使用

取绝对位置的元素

这他喵的还要我教的话,那你就别学数据结构了,这是最基本的索引,下标知识。

  • 下标是从 0

取指定范围元素

这里就简单复习一下切片
这博主写的不错!(书写的不错~)
python之切片

实例

a = np.array([[1, 2, 3, 4],
             [5, 6, 7, 8],
             [9, 10, 11, 12]])

# 冒号表示所取的范围,跟列表的索引用法一样,
# 逗号用来区分每个维度,下面的代码表示[取倒数第二行到最后一行, 第二列到第三列
print(a[-2:, 1:3])

对指定范围元素进行运算

实例

a = np.array([
                [1, 2, 3, 4],
                [5, 6, 7, 8],
                [9, 10, 11, 12]
            ])

a[[0, 1, 2], [1, 1, 1]] += 10
print(a)

获取数组中大于或小于某个确定值的数值

result_index = a > 10

[[False  True False False]
 [False  True False False]
 [False  True  True  True]]

四、元素数据类型

dtype:查看数据类型


a1 = np.array([1, 2,  3])

print(a1.dtype)


int32

astype:转换数据类型

a = np.array(['1.2', '1.3', '1.4'], dtype = np.string_)

 array([b'1.2', b'1.3', b'1.4'], dtype='|S3')


a.astype(np.float)
array([1.2, 1.3, 1.4])

sry,我看了看比赛的赛题要求,资格赛的pands,numpy,Matplotlib都是考的基础,但是,半决赛要求的大数据我好多都还没学!悲催的我才转行三个月,so,上面的知识我后面比赛完了补充!

# 查看类型

a= np.linspace(1,10,10)
print(a)
# 查看数据的类型
print(type(a))
# 查看数组中的数据类型 dtype
print(a.dtype)
# 查看形状  返回一个元组
print(a.shape)
#查看元素的数目
print(a.size)
# 查看数组的维度
print(a.ndim)

五 、截图

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第1张图片
在这里插入图片描述
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第2张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第3张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第4张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第5张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第6张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第7张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第8张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第9张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第10张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第11张图片
此处优化为

a[-2:,-2:]

更好


Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第12张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第13张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第14张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第15张图片Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第16张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第17张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第18张图片Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第19张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第20张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第21张图片
↑同zip函数概念

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第22张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第23张图片Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第24张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第25张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第26张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第27张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第28张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第29张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第30张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第31张图片
在这里插入图片描述
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第32张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第33张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第34张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第35张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第36张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第37张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第38张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第39张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第40张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第41张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第42张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第43张图片
在这里插入图片描述
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第44张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第45张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第46张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第47张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第48张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第49张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第50张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第51张图片
在这里插入图片描述
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第52张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第53张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第54张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第55张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第56张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第57张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第58张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第59张图片
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第60张图片
在这里插入图片描述
Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第61张图片
在这里插入图片描述

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第62张图片

Python之Numpy,从0到掌握(偏向实战+源码+赛前抱佛脚)_第63张图片
以上截图是网上听课,主要是他原视频也这么胡

你可能感兴趣的:(#,数据结构与函数,numpy,python)