分享

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

 昵称10087950 2022-07-29 发布于江苏
作者丨黄伟呢
来源丨凹凸数据

最近给大家更新一波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系列持续更新中~

图片


图片

在看点这里图片好文分享给更多人↓↓

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多