以下结果均在解释器下验证成功

通过查看源码和解释器验证发现np.newaxis是通过None实现的

1
2
3
4
5
>>> import numpy as np
>>> type(np.newaxis)
<class 'NoneType'>
>>> np.newaxis == None
True

在理解np.newaxis之前我们先看下面代码

1
2
3
4
5
>>> a = np.arange(3) 
>>> print(a)
array([0, 1, 2])
>>> a.shape
(3,)

(3,)所代表的含义是什么??按照我们平常的理解a应该是个一行三列的矩阵,为什么不是(,3)呢?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
>>> a[:, np.newaxis]
array([[0],
       [1],
       [2]])

>>> a[:, None]
array([[0],
       [1],
       [2]])

>>> a[:, np.newaxis].shape
(3, 1)

上面代码中使用np.newaxis成功为每个元素增加一个维度,使之处在同一个维度即一列上,上面的列子可能有点特殊,看下面

1
2
3
4
5
6
7
8
>>> a = np.array([[1,2],[3,4]])
>>> a
array([[1, 2],
       [3, 4]])
>>> a[:,np.newaxis]
array([[[1, 2]],

       [[3, 4]]])

这看起来可能不太好理解,可是他的确,变成了三维,他为其中的两个元素[1,2],[3,4]同时增加了一个维度,他们两个在同一维度上,在解释器里验证一下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> b = a[:,np.newaxis]
>>> b.shape
(2, 1, 2)
>>> b[0,0,0]
1
>>> b[0,0,1]
2
>>> b[1,0,0]
3
>>> b[1,0,1]
4

现在回过头来看(3,)他表示的其实是一维矩阵的形状,(3,) != (3,0) and (3,) != (3,None),他只是一维矩阵的一种表示形式(元素个数,),当我们为 一维矩阵增加一个维度时,他就会便变成二维的,即我们熟悉的(行数,列数),当我们再增加一个维度时表示为(行数, 第三维维数,列数)

再来看个例子

1
2
3
4
5
6
7
8
>>> a = np.array([[1,2,3],[2,3,4]])
>>> a[:, 1]  # 获得了一个一维的矩阵
array([2, 3])
>>> a[:1].shape  
(3,)
>>> a[:,[1,2]] 
array([2,3],
      [3,4])

a[:,[1,2]]类似的做了这样一个操作np.hstack([X[:, 1][:, np.newaxis], X[:, 3][:, np.newaxis]]),自动加维并竖直合并.