一行代码生成希尔伯特矩阵(Python)矩阵迅速扩展操作

简述

在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)

扫描二维码关注公众号,回复: 2527380 查看本文章

例如:

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所在的维度进行移动,这个维度上的元素(抽象,整体化一下)都各自添加一个维度

猜你喜欢

转载自blog.csdn.net/a19990412/article/details/81361148
今日推荐