目录
- 1.疑问:
- 2.概念梳理:
-
- 2.1 数学中的"向量"
- 2.2 NumPy 数组
- 3. 进一步探究
-
- 3.1 why NumPy ?
- 3.2 NumPy 数组的打印规则
- 3.3 NumPy 的广播机制
- 3.3 Python array 和 NumPy array
- 3.4 NumPy array 和 Pandas
1.疑问:
- 一直很疑惑为什么 NumPy 默认是行向量?
- (3,)还是(3,1)?
- 明明Python 有内置的数组结构,为什么还再需要创造一个NumPy 数组?NumPy array 和 Python 内置的 array之间到底有什么区别?
- Numpy ndarray 和 Pandas 之间又有什么区别和联系?
今天就专门花时间来梳理一下相关的知识点。
2.概念梳理:
2.1 数学中的"向量"
数学中,向量空间中的元素被称为向量。
而我们常见的坐标系下表示的坐标向量只是向量基于坐标系的一种表达方式。(向量空间还可以用除了坐标系之外方式表示)
线性代数中,对行向量和列向量进行了一个区分,而在 NumPy 中却没有这个说法——NumPy 中只存在 ndarray(NumPy N 维的数组)。
2.2 NumPy 数组
一个 NumPy array 是一个 N 维的容器,它里面装的是具有相同数据类型和相同大小的元素。
由此可见,作为一种计算机程序的数据结构,它是有一定限制的,即有一些值是不能为NumPy array 所表示的。
因此, NumPy array ≠ 数学中的向量,而只是用来作为向量的一种近似表示。
3. 进一步探究
3.1 why NumPy ?
我们都知道了 NumPy 中最重要的数据结构就是 ndarray,可以说 ndarray 结构的建立就是为了满足将 N (N>2)维数组的概念都包含进来。换句话说,是将数组的概念推广至 N 维,而 NumPy 操作就是为了高维的运算而创造出来的。(记住,NumPy 的初衷是为了既能近似表示向量又能方便地进行一些列向量操作)
因此,我们不必再纠结为什么我们熟悉的向量用“列”表达——“列向量”,到了 NumPy 中却成了用“行”表达——行向量。因为,每种系统下面向量的表达都有它自己的规则和依据,也很正常。
3.2 NumPy 数组的打印规则
可以看到,
对于一维数组(也就是最后一根轴),NumPy 的打印规则是从左到右依(横向)此打印出所有元素;
对于二维数组,最内层的轴(即最后一个轴)是从左往右横向打印,次内层的轴(即第一根轴)是从上往下的打印顺序;
对于三维数组,最里面的轴是从左到右,剩下的两根是从上到下的打印顺序。
(理解方式:内层是相邻外层元素的元素)
一句话:NumPy 数组的打印顺序:最内层的轴的元素(最里面的[ ])是从左至右,剩下的轴都是从上至下的顺序。
3.3 NumPy 的广播机制
当不同大小的数组有运算需求的时候,NumPy 数组会在“左边”进行自动“广播”操作。
例如,一个形状为(3,)的一维数组可以在广播的机制下变为一个形状为(1,3)的二维数组,同理,也可以变为三维数组(1,1,3)等。
此时,形状为(3,)的一维数组就可以被看为一个行向量,因为它随时可以被“广播”变为一个形状为(1, 3)的二维向量:
n1 = np.array(range(5)).reshape(1,5)
n2 = np.array(range(5)).reshape(5)print('二维数组 n1: {}'.format(n1))
print('一维数组 n2: {}'.format(n2))二维数组 n1: [[0 1 2 3 4]]
一维数组 n2: [0 1 2 3 4]
广播机制,并不会”右边“进行数组扩展,除非明确指定是哪根轴:
n3 = np.array(range(5))[:, np.newaxis]
print(n3)[[0][1][2][3][4]]
也可以使用reshape 中的 -1 参数来实现:
n3 = np.array(range(5)).reshape(-1, 1)
print(n3)[[0][1][2][3][4]]
3.3 Python array 和 NumPy array
https://blog.csdn.net/liyaohhh/article/details/51055147
3.4 NumPy array 和 Pandas
Pandas 的 Series 和 Dataframe 多了 标签。