查看原文
其他

手撕numpy(一):简单说明和创建数组的不同方式​​​​​

黄伟呢 凹凸数据 2021-08-09
↑ 关注 + 星标 ~ 有趣的不像个技术号每晚九点,我们准时相约  


大家好,我是黄同学


最近给大家更新一波python的基础知识,这次带来的是手撕numpy系列。

1、numpy的简介


numpy是"Numerical Python"的简称。


numpy提供了一个高性能的多维数组对象ndarray(N Dimension Array),以及大量的库函数和操作,可以帮助程序员轻松地进行数值计算。


原生python语言执行速度很慢,C执行500次,python差不多只能执行一次,但是python语法比其它编程语言要简单的多得多。因此我们既想要某一个编程语言执行速快,同时还编程简单。最终python通过集成C和C++,最终解决这个问题,也就是说:底层运行的是C和C++的代码,但是上层使用的是python语言去写的。这就是我们为什么都喜欢使用"numpy库"的原因。


numpy作为很多的用来做数据挖掘,数据分析,人工智能相关的技术组件的底层实现。像SciPy、Matplotlib、Scikit-learn在一定程度上,都需要依赖numpy。


2、学习numpy的套路


学习怎么使用numpy组织数据(怎么创建出,你想要的不同维度,不同形状的数组):numpy提供了一个高性能的多维数组对象:ndarray。


学习numpy提供的函数处理这个组好的数据:numpy提供了很多很多的库函数,帮助我们处理这些数据。


3、关于numpy中ndarray数据对象的结构说明


numpy中最重要的数据结构是称为ndarray的n维数组对象,这个对象由两部分构成:

  • 元数据部分:存储的是当前这个ndarray对象的一些描述信息;

  • 真实数据部分:存储的是当前这个ndarray对象中的真实数据。


1)什么是ndarray数组对象的描述信息呢?



注意:上述图中的shape、size、dtype、ndim等都是x这个ndarray对象的描述信息,这些信息都存储在元数据区域。而1,2,3,4,5,6就是这个对象中的真实数据。


4、ndarray数组和list列表的简单对比


① ndarray数组和list中的数据类型


list列表中可以存储不同的数据类型,例如:x = [1,2.3,True,“中国”]。ndarray数组中存储的所有的元素的类型,都必须一致。


② 使用numpy创建数组和使用原生list的效率对比



③ 使用ndarray创建数组的好处


既然ndarray中,每个元素的类型既然是一致的,那么整个ndaray就只需要一个元数据信息就可以了,而不是像list一样,每个对象都需要存储一个元数据信息。


ndarray好处在于:1、由于元数据只需要存储一份,所以可以更节省空间。2、由于每个元素的类型一致,就证明每个元素占用内存的大小是一致的,那么这样的数据的存储可以更紧凑,操作更高效。


5、什么是维度?


① 用一个例子进行说明



② 一张图形象说明一维数组、二维数组、三维数组的ndarray写法



③ 针对上述知识点进行举例说明


6、创建数组的几种不同方式


1)利用array()函数去创建数组;


操作如下

import numpy as np

array1 = [1,2,3]
m = np.array(array1)
display(m)

array2 = [[1,2,3],[4,5,6]]
n = np.array(array2)
display(n)

结果如下:


结论如下:


  • np.array(参数)函数,参数给了什么样式的数据,就构建什么样式的ndarray数组;你给我一个一维列表,我就构建一个一维数组;你给我一个二维列表,我就构建一个二维数组;

  • 什么是二维列表?每个元素都是一个一维列表的列表,就是一个二维列表;

  • 如果我构建了一个二维列表,那么这个二维列表中的每个元素就都是一个一维列表;

  • 在numpy中,一维数组又叫做"向量";二维数组又叫做"矩阵";


2)利用arange()函数去创建数组:对比列表的range()函数学习;


① 相同点:用法都是相同的

# 语法如下:
range(start,end,step)
arange(start,end,step)
# 举例如下:
list1 = list(range(1,10,2))
display(list1)
array1 = np.arange(1,10,2)
display(array1)

结果如下:


② 不同点:arange()函数的步长,可以是浮点数,但是range()函数的步长,不能是浮点数

list1 = list(range(1,10,2))
display(list1)
list2 = list(range(1,10,0.5))
display(list2)
list3 = list(range(10,1,-2))
display(list3)

array1 = np.arange(1,10,2)
display(array1)
array2 = np.arange(1,10,0.5)
display(array2)
array3 = np.arange(10,1,-2)
display(array4)

结果如下:


3)利用指定值生成指定形状的数组;


① 常用函数如下


  • np.zeros((x,y)):生成一个x行y列的,元素都是0的二维数组;

  • np.ones((x,y)):生成一个x行y列的,元素都是1的二维数组;

  • np.full((x,y),value):生成一个x行y列的,元素都是value的二维数组,其中这个value值可以是整数(正整数,0,负整数)或者小数;


② 代码如下

array1 = np.zeros((3,4))
display(array1)

array2 = np.ones((3,4))
display(array2)

array1 = np.full((3,4),1.2)
display(array3)

结果如下:


注意:我这里以创建二维数组为例,你传入一个数字,就可以创建一维数组;你传入三个数字,就可以创建三维数组,可以自己下去试一试。


4)按照已有的ndarray数组的形状,创建形状相同但指定元素的ndarray数组;


① 常用函数如下

  • np.zeros_like()

  • np.ones_like()

  • np.full_like()

② 操作如下

## 1)先创建一个一维数组和一个二维数组;
n1 = np.array([1,2,3]);
n2 = np.array([[1,2,3],[4,5,6]])

## 2)使用np.zeros_like()
array1 = np.zeros_like(n1)
array2 = np.zeros_like(n2)
display(array1)
display(array2)

## 3)np.ones_like()
array3 = np.ones_like(n1)
array4 = np.ones_like(n2)
display(array3)
display(array4)

## 4)np.full_like()
array5 = np.full_like(n1)
array6 = np.full_like(n2)
display(array5)
display(array6)

结果如下:


5)创建单位矩阵和对角矩阵;


① 创建单位矩阵

## 1)np.eye(x)和np.identity(x)
array1 = np.eye(3)
display(array1)

array2 = np.identity(4)
display(array2)

结果如下:


② 创建对角矩阵

## 1)np.diag()
array1 = np.diag([10,20,30])
display(array1)

结果如下:


6)创建等差数列数组:对比arange()函数和linspace()函数学习;


① np.arange()和np.linspace()创建等差数列的区别


  • np.arange(start,stop,step)第三个参数指的是元素步长;

  • np.linspace(start,stop,num)第三个参数指的是元素个数;

  • np.arange()取不到最大的那个值stop,np.linspace()默认可以取到最大值stop;


② 用法如下

array1 = np.arange(1,15,3)
display(array1)
display(array1.dtype)

array2 = np.linspace(1,15,3)
display(array2)
display(array2.dtype)

结果如下:


③ np.linspace()中两个常用的参数:endpoint和dtype


  • endpoint=True表示是包含终止值(默认),endpoint=False表示不包含终止值;

  • dtype=np.float64指定创建的数组的数据类型默认是float64,你也可以设置为dtype=np.np.int32;

array3 = np.linspace(1,20,num=5,endpoint=False,dtype=np.float64)
display(array3)

array4 = np.linspace(1,20,num=5,endpoint=False,dtype=np.int32)
display(array4)

array5 = np.linspace(1,20,num=5,endpoint=True,dtype=np.float64)
display(array5)

array6 = np.linspace(1,20,num=5,endpoint=True,dtype=np.int32)
display(array6)

结果如下:


7)创建等比数列数组;


① 用一个例子进行说明

log_array = np.logspace(1, 7, num=4, endpoint=True, base=2)
display(log_array)

结果如下:


注意:上述代码表示在2的一次方到2的七次方之间,生成4个数,这四个数字还构成了一个等比数列。


② 再看另外一个案例

log_array1 = np.logspace(1, 5, 3)
display(log_array1)

结果如下:


注意:上述代码表示会默认base=10,也就是说,在10的一次方到10的五次方之间,生成3个数,这3个数还构成一个等比数列。


8)通过自定义函数创建数组;

## 1)np.fromfunction()
## 定义一个函数
def f(x, y):
return x * 2 + 1 + y

## 从一个函数生成一个二维数组;
b = np.fromfunction(f, (3,3), dtype=np.int32)
display(b)

## 在这个函数,f函数要接收的参数,就是当前元素的坐标;
## 0行0列,传入的就是x=0,y=0;
## 0行1列,传入的就是x=0,y=1;
## 3行2列,传入的就是x=3,y=2;

结果如下:


numpy系列持续更新中~


如果觉得文章对你有帮助,欢迎扫描二维码关注黄同学的CSDN博客






近期文章,点击图片即可查看






后台回复关键词「进群」,即刻加入读者交流群~


numpy系列持续更新中~

朱小五

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存