目录
本文作为学习NumPy快速教程之后的知识补充,只有真正、正确地理解了每个概念意思,才会再以后的学习过程中少走弯路。
在NumPy的学习中,我们最重要的学习目标就是它的ndarray对象。
1. 数组对象
- 三个基本对象:
1.ndarray本身
ndarray是同质的(homogenous):每个项目占用相同大小的内存块, 并且所有块都以完全相同的方式解释。
好处:
数组对象采用相同的数据类型,有助于节省运算和存储空间
2.数据类型(data-type object)
描述数组中单个固定大小元素布局的数据类型对象
3.数组标量(array-scalar)
访问数组的单个元素时返回的数组标量Python对象
- ndarray对象
ndarray是NumPy数组的类。
ndarray最常见的属性:
nidm:数组维度的个数
shape:数组每个维度上元素的个数
size:数组所有维度元素个数的总数
可以看到这三个属性都是围绕数组的元素和数组的维度来进行的(最核心的还是元素):
-
nidm 表示的是数组维度的个数。
-
shape 能反映每个维度所含有的元素数量,其实shape还隐含了维度的个数——shape( )输入的参数(元组中)有几个数字即代表数组有几个维度!所以,要记住,通过shape能够知道数组的维度数以及数组的大小。
注意一个误区:shape并非一定表示的是数组有几行几列!,比如一维向量的情况。 -
size 反应的是整个数组所有元素的一个统计。
2. Numpy 中维度(dimentio)与轴 (axis)
首先要明白,在NumPy中
维度 (dimension) = 轴 (axis)
——官方的定义是:“ In NumPy dimensions are called axes.”,即,在NumPy中,(数组的)维度被称为轴。
判断一个数组轴的数量,分享下我自己的方法:最直观的是看[ ]的数量,有几层中括号就有几个维度/轴。还有一个方法是,查看数组shape,有几个元素,就有几个维度/轴。个人感觉方法很土,但也比较简单。
3.NumPy 的 ndim 与矩阵的秩 (rank)
首先要明白,NumPy中的 ndim 是(NumPy)数组含有的维度的个数或者说轴的个数。(上面已经提到“维度”和“轴”等价)
那么维度/轴的个数——ndim,跟矩阵的秩又是什么关系呢?
先给结论:
NumPy 中的 ndim = rank(NumPy中的秩) ≠ 线代中rank(矩阵的秩)
——官方(NumPy v1.12)的定义:“The number of axes is rank.”(在最新的官方文档-NumPy v1.17中,似乎已经没有了这个定义,或者移动位置了?)
说白了,在NumPy中,秩(rank) = ndim
举个例子:
例如,在三维空间中 [1, 2, 1] 的点的坐标是秩为1的数组,因为它有一个轴,这个轴的长度是3。对于下面的例子,这个数组的秩是2(它是二维的),第一个维度(轴)的长度是2,第二个维度的长度是3。
[[ 1., 0., 0.],
[ 0., 1., 2.]]
因此,NumPy中的秩,完全不同于在线性代数中,矩阵的秩。自然而然,NumPy中的维度也就不同于我们熟悉的数学中的维度,前者指的是数组维度的大小或者/轴的数量,而后者,指的是在空间中表示一个点所需要的最少坐标个数。
4. 一个坑:NumPy中的向量
先看代码后面的情况说明:
a = np.array(range(3))
b = a.T
c = a.transpose()
d = a[:, np.newaxis]
e = a.reshape(3, 1)
print("a:", a)
print("a.T:", b)
print("a.transpose:", c)
print("d: \n", d)
print("e: \n", e)
4.1 一维数组在NumPy中到底是行向量还是列向量?
一维数组在NumPy中打印的结果是一行数组,因为
numpy 默认把列向量转化为行向量
4.2 一维数组如何转置?
使用 b 和 c 的方法不成功;
使用 d 和 e 两种方法都可以!
4.3 一维数组转置后的属性?
注意看一维数组转置前后的shape
5. 一些常用函数和操作
5.1 生成数组常用的numpy.random模块:
大致功能查看:
① 随机生成[0,1)之间的浮点数
np.random.random()
np.random.rand()
② 标准正态分布随机数
np.random.randn()
③ 产生随机整数
np.random.randint()
④ 将序列的所有元素随机排序
np.random.shuffle()
输入参数的格式可以参考下表:
待续…