这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战
基本要求
Numpy 是设计之初就是为了表示和操作 n 维数组,通常这里 n 要大于 2 也就是我们所说的高维矩阵,或者是 tensor,在 Numpy 我们定义和操作高维矩阵通常不会用到 for-loops 这种遍历方法来访问高维矩阵(数组),这样我们需要引入一些新的概念帮助我们来理解如何定义和遍历高维数组,这里就暂且叫数组吧,因为 Numpy 中不都是 ndnarray 吗。
目标
通过本次分享,将了解如何使用 numpy 来创建一个高维数组、以及无需 for 循环来遍历数组就可以对数组进行线性变换和操作。
基础知识
在 Numpy 中,核心就是 ndarray,有点类似 tensor 在 pytorch 和 tensorflow 中的地位。Numpy 主要操作的对象是同构多维数组,这里同构就是数组中元素都是同一类型。索引是非负整数,在 Numpy 中纬度用 axis 来表示。
Numpy 安装以及导入
pip install numpy
然后我们就可以将 numpy 导入并且给 numpy 起个别名
import numpy as np
import matplotlib.pyplot as plt
导入 numpy 以后我们就可以调用 np.array 然后传入一个 list 来得到一个 ndarray。
a = np.array([1,2,3])
b = np.array([[2,3,5],[5,6,7]])
a
array([1, 2, 3])
例如 a 三维空间中的点,这个点可以用一个一维的向量来表示 [1, 2, 3],也就是一个轴 (axis)。x 3 个元素,所以长度是 3
b
array([[2, 3, 5],
[5, 6, 7]])
在 b 数组中,有 2 个轴,第一个轴的长度为 2,第二个轴的长度为 3。
print(b.dtype.name)
print(b.size)
print(b.ndim)
print(b.shape)
print(b.itemsize)
print(b.data)
int32
6
2
(2, 3)
4
<memory at 0x000002382BE982D0>
NumPy 的数组类被称为 ndarray。在 Numpy 中可能为了区分于普通数组,所以将 array 起了一个别名 ndarray。注意 numpy.array 与标准Python库中的array.array类不同,后者只处理一维数组,提供的功能较少。ndarray 对象的更重要的属性是。
- dtype: 查看 ndarray 数组的元素的类型,可以在创建 ndarray 时候指定 dtype ,可以指定 python 数据类型,numpy 也提供一些数据类型
- ndim: 表示 ndarray 轴的个数,也就是说成维度
- shape: 知道了 ndarray 的维度后,可以通过 shape 来查看每一个维度的长度,对于一个 n 行 m 列的矩阵来说,shape 就是(n,m) 这样 tuple 数据类型,其长度就是数组的维度
- size: ndarray 中元素总的个数,也就是 shape 各个维度长度乘积
- itemsize: 数组中每个元素的大小(字节)。例如,float64 类型的数组有 itemsize 8 (=64/8),而一个 complex32 类型的数组有 itemsize 4 (=32/8)。等同于 ndarray.dtype.itemsize。
创建数组
在 Numpy 中提供各种各样的方式来创建一个 ndarray,这里可能不会一一提到,主要挑一些常用,也是自己实际工作和学习中接触到创建数组给大家分享。最简单最直接方法就是将 python 的 list 和 tuple 传入到 np.array 来创建一个 ndarray 创建时 numpy 会根据传入的集合元素类型来推断 dtype 的类型
a = np.array([1,2,3])
a.dtype #dtype('int32')
b = np.array((1.,2.,3.))
b.dtype #dtype('float64')
a = np.array(1.,2.,3.)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-16-7d2a1cb7e529> in <module>
----> 1 a = np.array(1.,2.,3.)
TypeError: array() takes from 1 to 2 positional arguments but 3 were given
注意不能之间将元素传入到 np.array 中,np.array 只接受一个序列做第一个参数
a = np.array([2, 3, 4], dtype=np.uint32)
我们也可以在创建 np.array 时候指定数组元素的类型。