作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Paddle 2.3.2
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。
最后更新:2022-1-19
Numpy的核心是什么?=====> ndarry数组,也就是说numpy最重要的数据结构就是称为ndarray的n-dim数组,它由两个部分构成:
1). 元数组部分:存储着当前ndarray对象的描述信息;
2). 数据部分:存储着当前ndarry对象的真实数据。
import numpy as np
x = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) display(x) print("x = \n{}".format(x))
array([[ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9, 10, 11, 12]]) x = [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12]]
x.shape
(3, 4)
x.size
12
x.dtype
dtype('int32')
x.ndim
2
x = list(range(1000000)) %timeit [i**2 for i in x]
338 ms ± 5.24 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
import numpy as np y = np.arange(1000000) %timeit y**2
1.95 ms ± 55.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
可以看到numpy的执行效率要远优于python内置的list。
import numpy as np # 一维数组 a = np.array([1, 2, 3, 4, 5, 6]) print("我是一个维度为{}的一维数组:\n{}".format(a.ndim, a)) # 二维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) print("我是一个维度为{}的二维数组:\n{}".format(b.ndim, b)) # 三维数组 c = np.array([[[1,2,3], [4,5,6],[7,8,9]],[[1,2,3], [4,5,6],[7,8,9]]]) print('我是一个维度为{}的三维数组:\n{}'.format(c.ndim, c))
我是一个维度为1的一维数组: [1 2 3 4 5 6] 我是一个维度为2的二维数组: [[1 2 3] [4 5 6]] 我是一个维度为3的三维数组: [[[1 2 3] [4 5 6] [7 8 9]] [[1 2 3] [4 5 6] [7 8 9]]]
# 分别从一维、二维、三维数组中获取元素值为 "6" 的方法 import numpy as np print('我是一维数组的{}'.format(a[5])) print('我是二维数组的{}'.format(b[1][2])) print('我是三维数组的{}'.format(c[0][1][2]))
我是一维数组的6
我是二维数组的6
我是三维数组的6
import numpy as np array1 = [1,2,3] a = np.array(array1) display(a) array2 = [[1,2,3],[4,5,6]] b = np.array(array2) display(b)
array([1, 2, 3]) array([[1, 2, 3], [4, 5, 6]])
结论如下
注意:arange()函数的步长,可以是浮点数,但是range()函数的步长,不能是浮点数
# 正向递增 list1 = list(range(1,10,2)) display(list1)
[1, 3, 5, 7, 9]
# 浮点型正向递增 list2 = list(range(1,10,0.5)) display(list2)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-1-e8ab0069a4e6> in <module> 1 # 浮点型正向递增 ----> 2 list2 = list(range(1,10,0.5)) 3 display(list2) TypeError: 'float' object cannot be interpreted as an integer
# 反向递减 list3 = list(range(10,1,-2)) display(list3)
[10, 8, 6, 4, 2]
# 正向递增 array1 = np.arange(1,10,2) display(array1) # 浮点型正向递增 array2 = np.arange(1,10,0.5) display(array2) # 反向递减 array3 = np.arange(10,1,-2) display(array3)
array([1, 3, 5, 7, 9]) array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,7.5, 8. , 8.5, 9. , 9.5]) array([10, 8, 6, 4, 2])
array1 = np.zeros((3,4)) display(array1) array2 = np.ones((3,4)) display(array2) array1 = np.full((3,4),1.2) display(array3)
array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) array([10, 8, 6, 4, 2])
注意
此处以创建二维数组为例,你传入一个数字,就可以创建一维数组;你传入三个数字,就可以创建三维数组,可以自己下去试一试。*
## np.eye(x)和 np.identity(x) array1 = np.eye(3) display(array1) array2 = np.identity(4) display(array2)
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])
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)
array([ 1, 4, 7, 10, 13]) dtype('int32') array([ 1., 8., 15.]) dtype('float64')
## 定义一个函数 def f(x, y): return x * 2 + y + 1 ## 从一个函数生成一个二维数组; 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;
array([[1, 2, 3], [3, 4, 5], [5, 6, 7]])