REF
https://zhuanlan.zhihu.com/p/486373530?utm_id=0
None实际上是增加了一个维度,它不是原维度的索引。
以一维为例
x = np.arange(3) # array([0, 1, 2])
( 注意,这个一维数组的shape是(3,),而不是(1,3),初学者很容易犯错。)
如果想把x的shape变成(1,3),只需要把None放在第一个维度的位置,以下两种写法等价:
x[None,:]
x[None]
结果如下:
array([[0, 1, 2]])
如果想把x的shape变成(3,1),只需要把None放在第二个维度的位置:
x[:,None]
结果如下:
array([[0],
[1],
[2]])
其实,None可以任意添加和组合,例如下面的写法:
x[None,:,None,None]
结果如下:
array([[[[0]],
[[1]],
[[2]]]])
这个数组的shape是(1,3,1,1)。
以二维为例
x = np.arange(6).reshape((2,3))
x如下:
array([[0, 1, 2],
[3, 4, 5]])
在第一个维度插入,以下三种写法等价:
x[None]
x[None,:]
x[None,:,:]
输出结果如下,shape为(1, 2, 3):
array([[[0, 1, 2],
[3, 4, 5]]])
在第二个维度插入,以下两种写法等价:
x[:,None]
x[:,None,:]
输出结果如下,shape为(2, 1, 3):
array([[[0, 1, 2]],
[[3, 4, 5]]])
在第三个维度插入:
x[:,:,None]
输出结果如下,shape为(2, 3, 1):
array([[[0],
[1],
[2]],
[[3],
[4],
[5]]])
更高维的情况以此类推。
这种写法一般在进行矩阵运算的时候会用到。比如:
x = np.arange(5)
x[:, None] + x[None, :]
这样可以很优雅地获得 列向量+行向量 的结果(划重点:优雅~):
array([[0, 1, 2, 3, 4],
[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8]])
参考
- ^1 https://numpy.org/doc/1.22/user/basics.indexing.html?highlight=slice#slicing-and-striding
- ^2 https://numpy.org/doc/1.22/reference/constants.html#numpy.newaxis
- ^3 https://numpy.org/doc/1.22/user/basics.indexing.html?highlight=slice#dimensional-indexing-tools