手撕numpy(一):简单说明和创建数组的不同方式
大家好,我是黄同学
最近给大家更新一波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系列持续更新中~
朱小五