【项目023】Numpy基础科学库极简使用说明

作者:欧新宇(Xinyu OU)
当前版本:Release v1.0
开发平台:Paddle 2.3.2
运行环境:Intel Core i7-7700K CPU 4.2GHz, nVidia GeForce GTX 1080 Ti
本教案所涉及的数据集仅用于教学和交流使用,请勿用作商用。

最后更新:2022-1-19


1. Why Numpy?

2. Numpy的套路

Numpy的核心是什么?=====> ndarry数组,也就是说numpy最重要的数据结构就是称为ndarray的n-dim数组,它由两个部分构成:
1). 元数组部分:存储着当前ndarray对象的描述信息;
2). 数据部分:存储着当前ndarry对象的真实数据。

3. Numpy的基本属性

载入numpy

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

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

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。

5. 关于维度

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

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

利用array()函数创建数组

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()函数

注意: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]])