Python库Numpy使用入门

本篇是慕课网Python人工智能常用库Numpy使用入门整理的学习笔记

Anaconda介绍与安装

anaconda是一个开源的用于科学计算的Python发行版本,是一个包管理器、环境管理器,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。它里面预装好了conda、某个版本的python、众多packages、科学计算工具等等。

访问官网下载安装包直接安装,安装时把Add Anaconda to my PATH environment variable也勾上了。

jupyter notebook简单教程

安装好anaconda之后点击开始,找到Anaconda文件夹,点击Jupyter Notebook就可以打开,这样打开的话可以看到命令行里:

1
2
3
4
[I 23:31:32.533 NotebookApp] Writing notebook server cookie secret to C:\Users\ASUS\AppData\Roaming\jupyter\runtime\notebook_cookie_secret
[I 23:31:34.383 NotebookApp] JupyterLab beta preview extension loaded from D:\ProgramFiles\Anaconda3\lib\site-packages\jupyterlab
[I 23:31:34.383 NotebookApp] JupyterLab application directory is D:\ProgramFiles\Anaconda3\share\jupyter\lab
[I 23:31:34.555 NotebookApp] Serving notebooks from local directory: C:\Users\ASUS

创建的文件都是放在C:\Users\ASUS目录里的。

要自行选择文件夹保存,可以cmd命令行切换到你要保存的目录下,运行jupyter notebook

这里需要注意:如果前面安装时没有勾选Add Anaconda to my PATH environment variable就不能直接使用命令行的方式打开。

在打开的Jupyter noteb里点击右上角的New,选择Python3就可以新建一个notebook。点击Untitled可以给文件命名,然后可以看到文件夹里的文件了

jupyter notebook

可以点击选择编写代码还是markdown笔记,旁边还有一些快捷按钮。前面几个按顺序分别是:保存、新增一行输入框、删除选中行、复制、粘贴、上移、下移。此外,最后一个键盘样的按钮可以查看快捷键。

编写好代码或者markdown都可以使用alt + enter快捷键查看输出。

Numpy简单教程 - 数组

以下内容导出自jupyter notebook,点击这里可以看得比较清晰。

数组Array(rank (数组的维数)):

1
import numpy as np
1
a = np.array([1, 2, 3])
1
a
array([1, 2, 3])
1
type(a)
numpy.ndarray
1
a.shape  # 数组的大小
(3,)
1
a = a.reshape((1, -1))  # 1表示数组是1行,-1是占位符,其实代表的是3列
1
a.shape
(1, 3)
1
a = np.array([1, 2, 3, 4, 5, 6])
1
a.shape
(6,)
1
a = a.reshape((2, -1))  # 这里的2代表2行,-1代表3列,因为6个元素变成2行
1
a.shape
(2, 3)
1
a
array([[1, 2, 3],
       [4, 5, 6]])
1
a = a.reshape((-1, 2))  # -1只是占位符,可以放在任意位置,这里-1表示3行
1
a
array([[1, 2],
       [3, 4],
       [5, 6]])
1
a[2, 0]
5
1
a[2, 0] = 55
1
a
array([[ 1,  2],
       [ 3,  4],
       [55,  6]])

zeros()可以用于创建元素全为0的数组

1
a = np.zeros((3, 2))
1
a
array([[0., 0.],
       [0., 0.],
       [0., 0.]])

ones()可以用于创建元素全为1的数组

1
a = np.ones((2, 3))
1
a
array([[1., 1., 1.],
       [1., 1., 1.]])

full()可以用于创建元素全为指定值的数组

1
a = np.full((2, 3), 3)
1
a
array([[3, 3, 3],
       [3, 3, 3]])

eye()可以用于创建指定维度的单位矩阵

1
a = np.eye(3)
1
a
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

random.random()可以用于创建元素值都是0-1之间的随机数组

1
a = np.random.random((3, 4))
1
a
array([[0.07850067, 0.26126437, 0.27118259, 0.99299099],
       [0.74982937, 0.3804697 , 0.14492257, 0.42120364],
       [0.34282385, 0.69722592, 0.06523827, 0.16707083]])

Numpy简单教程 - 索引操作

indexing索引操作:

1
2
3
a = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
1
a[-2:, 1:3]  # -2:表示倒数第二行到最后一行,1:3表示第二列到第三列,索引从0开始
array([[ 6,  7],
       [10, 11]])
1
a[1, -2]  # 第二行,倒数第二列
7
1
a.shape
(3, 4)
1
b = a[-2:, 1:3]
1
b.shape  # 维度变低了
(2, 2)
1
b = a[2, 1:3]
1
b
array([10, 11])
1
b.shape
(2,)
1
b = a[1,2]
1
b
7
1
b.shape
()
1
a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
1
a[np.arange(3), 1] += 10  # 第二列所有元素加10
1
a
array([[ 1, 12,  3,  4],
       [ 5, 16,  7,  8],
       [ 9, 20, 11, 12]])
1
np.arange(3)
array([0, 1, 2])
1
np.arange(3, 7)
array([3, 4, 5, 6])
1
a
array([[ 1, 22,  3,  4],
       [ 5, 26,  7,  8],
       [ 9, 30, 11, 12]])
1
a[np.arange(3), [1, 2, 3]] += 10  # 各行的第二三四列分别加10
1
a
array([[ 1, 32,  3,  4],
       [ 5, 26, 17,  8],
       [ 9, 30, 11, 22]])
1
a[[0, 1, 2], [1, 1, 1]] += 10  # 第二列所有元素加10
1
a
array([[ 1, 42,  3,  4],
       [ 5, 36, 17,  8],
       [ 9, 40, 11, 22]])
1
result_index = a>10  # 找出元素值大于10的索引
1
result_index
array([[False,  True, False, False],
       [False,  True,  True, False],
       [False,  True,  True,  True]])
1
a[result_index]  # 找出值大于10的元素
array([42, 36, 17, 40, 11, 22])
1
a[a>10]  # 找出值大于10的元素
array([42, 36, 17, 40, 11, 22])

Numpy简单教程 - 元素数据类型

1
a = np.array([1, 2])  # numpy会自动判断元素的数据类型
1
a.dtype
dtype('int32')
1
a = np.array([1.1, 2.2])
1
a.dtype
dtype('float64')
1
a = np.array([1, 2.2])  # 如果既有整数又有浮点数会当成浮点数
1
a.dtype
dtype('float64')
1
a = np.array([1.6, 2.2])
1
a = np.array([1.6, 2.2], dtype=np.int64)  # 手动指定成int类型
1
a  # 去除小数部分,不是四舍五入!
array([1, 2], dtype=int64)
1
a = np.array([1.6, 2.2])
1
b = np.array(a, dtype=np.int64)
1
b
array([1, 2], dtype=int64)

Numpy简单教程 - 数组运算与常用函数

数组运算

1
2
a = np.array([[1, 2],
[3, 4]])
1
2
b = np.array([[5, 6],
[6, 5]])
1
a+b  # 对应位置的元素相加
array([[6, 8],
       [9, 9]])
1
np.add(a,b)  # 和a+b相同
array([[6, 8],
       [9, 9]])
1
a-b  # 对应位置元素相减
array([[-4, -4],
       [-3, -1]])
1
np.subtract(a, b)  # 和a-b相同
array([[-4, -4],
       [-3, -1]])
1
a*b  # 对应位置的元素相乘,并不是矩阵的乘法
array([[ 5, 12],
       [18, 20]])
1
np.multiply(a, b)  # 和a*b相同
array([[ 5, 12],
       [18, 20]])
1
a/b  # 对应位置的元素相除
array([[0.2       , 0.33333333],
       [0.5       , 0.8       ]])
1
np.divide(a, b)   # 和a/b相同
array([[0.2       , 0.33333333],
       [0.5       , 0.8       ]])
1
np.sqrt(a)  # a的每个元素开方
array([[1.        , 1.41421356],
       [1.73205081, 2.        ]])
1
a
array([[1, 2],
       [3, 4]])
1
2
b = np.array([[1, 2, 3],
[4, 5, 6]])
1
a.dot(b)  # 矩阵乘法,a的列数要等于b的行数
array([[ 9, 12, 15],
       [19, 26, 33]])
1
np.dot(a, b)  # 矩阵乘法
array([[ 9, 12, 15],
       [19, 26, 33]])
1
np.dot(b, a)  # 报错
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-97-f65bf4b3a481> in <module>()
----> 1 np.dot(b, a)  # 报错


ValueError: shapes (2,3) and (2,2) not aligned: 3 (dim 1) != 2 (dim 0)

常用函数

sum

1
a
array([[1, 2],
       [3, 4]])
1
np.sum(a)  # 对数组的所有元素求和
10
1
np.sum(a, axis=0)  # 对数组的每一列元素求和
array([4, 6])
1
np.sum(a, axis=1)  # 对数组的每一行元素求和
array([3, 7])

mean

1
np.mean(a)  # 求a中元素的平均值
2.5
1
np.mean(a, axis=0)  # 求a中每一列元素的平均值, axis=0是对列进行操作
array([2., 3.])
1
np.mean(a, axis=1)  # 求a中每一行元素的平均值, axis=1是对行进行操作
array([1.5, 3.5])

uniform

1
np.random.uniform(3, 4)  # 产生指定范围内的随机小数
3.079329791701754
1
np.random.uniform(1, 100)
34.39661009456285

tile

1
a
array([[1, 2],
       [3, 4]])
1
np.tile(a, (1, 2))  # 将a当成一个元素生成一行两列的数组
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])
1
np.tile(a, (2, 3))  # 两行三列的a数组
array([[1, 2, 1, 2, 1, 2],
       [3, 4, 3, 4, 3, 4],
       [1, 2, 1, 2, 1, 2],
       [3, 4, 3, 4, 3, 4]])

argsort

1
2
a = np.array([[3, 6, 4, 11],
[5, 10, 1, 3]])
1
a.argsort()  # 对每一行元素从小到大排序,返回的是每个元素排序后的下标
array([[0, 2, 1, 3],
       [2, 3, 0, 1]], dtype=int32)
1
a.argsort(axis=0)  # 对每一列元素从小到大排序
array([[0, 0, 1, 1],
       [1, 1, 0, 0]], dtype=int32)

矩阵转置

1
a
array([[ 3,  6,  4, 11],
       [ 5, 10,  1,  3]])
1
a.T  # 转置
array([[ 3,  5],
       [ 6, 10],
       [ 4,  1],
       [11,  3]])
1
np.transpose(a)  # 和a.T相同
array([[ 3,  5],
       [ 6, 10],
       [ 4,  1],
       [11,  3]])

Numpy简单教程 - 广播

1
2
3
4
a = np.array([[1, 2, 3],
[2, 3, 4],
[12, 31, 22],
[2, 2, 2]])
1
b = np.array([1, 2, 3])
1
2
for i in range(4):  # 数据量比较大的时候,循环会比较低效,比较慢
a[i,:] += b
1
a
array([[ 2,  4,  6],
       [ 3,  5,  7],
       [13, 33, 25],
       [ 3,  4,  5]])
1
a + np.tile(b, (4, 1))
array([[ 3,  6,  9],
       [ 4,  7, 10],
       [14, 35, 28],
       [ 4,  6,  8]])
1
a + b  # 广播,自动将相加的数组转化为相同维度
array([[ 3,  6,  9],
       [ 4,  7, 10],
       [14, 35, 28],
       [ 4,  6,  8]])

上面的内容都是从jupyter notebook导出的,点击这里可以看得比较清晰。