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