简述
在Sklearn的document上看到的这个代码。简直是让人不得不佩服。太天才了!
下面这一行代码就生成了一个10*10的希尔伯特矩阵
X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])
没错,就是这么6
然后,怀着敬畏的心,对这个做进一步的研究。
print(np.arange(1, 11) + np.arange(0, 2)[:, np.newaxis])
输出的结果是:
[[ 1 2 3 4 5 6 7 8 9 10]
[ 2 3 4 5 6 7 8 9 10 11]]
要注意的是:
print(np.arange(1, 11) + 1)
print(np.arange(1, 11))
输出的结果是:
[ 2 3 4 5 6 7 8 9 10 11]
[ 1 2 3 4 5 6 7 8 9 10]
再进一步的探究:
print(np.arange(1, 10)[:, np.newaxis])
输出结果是:
[[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]]
简直了! Amazing!
这里告诉了我们两件事,一个ndarray( shape is m * 1) + ndarray(shape is n * 1) 变成了一个新的ndarray(shape is m * n)
例如:
a = np.array([[1, ], [2, ]])
print(np.arange(1, 11) + a)
输出的结果是:(注意,上面的关于a生成过程中逗号不能省去)
[[ 2 3 4 5 6 7 8 9 10 11]
[ 3 4 5 6 7 8 9 10 11 12]]
此外还有
a = np.array([[1, ], [2, ]])
print(a[:, np.newaxis])
这个输出是:
[[[1]]
[[2]]]
表面上看,这个操作实现了对于原来的函数的上增加一个新的维度。
但是还是很值得考究。比如下面的这个情况:
a = np.array([[1, 3], [2, 4]])
print(a[:, np.newaxis])
输出是:
[[[1 3]]
[[2 4]]]
目前可以理解的是,这个操作的效果。
解开最外层的list,然后每个元素都在外面套一个list,之后再套回来之前解开的那个套[]。这是一个比较形象的表述??
还是通过代码来描述吧:
a = np.arange(1, 11)
print(a[:])
输出的结果是:
[ 1 2 3 4 5 6 7 8 9 10]
- python中
:
表示全部意思。 - 之后通过,np.newaxis这参数的名字上可以知道,这个可以用来扩展一个新的轴。
- 第三个要注意了,这里讲np.newaxis放在了列的位置。(第二维度的位置)
a = np.arange(1, 11)
print(a[np.newaxis, :])
输出的结果是:
[[ 1 2 3 4 5 6 7 8 9 10]]
这个可以跟之前的进行对比,在行上进行了扩展。(即,按np.newaxis所在的维度进行移动,这个维度上的元素(抽象,整体化一下)都各自添加一个维度)