问题:numpy.newaxis如何工作以及何时使用?
当我尝试
numpy.newaxis结果为我提供了一个x轴从0到1 numpy.newaxis的二维绘图框。但是,当我尝试使用对向量进行切片时,
vector[0:4,]
[ 0.04965172  0.04979645  0.04994022  0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]除了将行向量更改为列向量之外,是否一样?
通常,的用途是什么numpy.newaxis,我们应该在什么情况下使用它?
回答 0
简而言之,当使用一次时,用于将现有数组的尺寸numpy.newaxis再增加一维。从而,
- 一维阵列将变为二维阵列 
- 2D阵列将变为3D阵列 
- 3D阵列将变成4D阵列 
- 4D阵列将变为5D阵列 
等等..
这里是一个视觉说明描绘促进 1D阵列以二维阵列。
方案1:如上图所示,np.newaxis当您想将一维数组显式转换为行向量或列向量时,可能会派上用场。
例:
# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)
# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :]     # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis]     # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)场景2:当我们想将numpy广播用作某些操作的一部分时,例如在添加一些数组时。
例:
假设您要添加以下两个数组:
 x1 = np.array([1, 2, 3, 4, 5])
 x2 = np.array([5, 4, 3])如果您尝试像这样添加它们,NumPy将引发以下内容ValueError:
ValueError: operands could not be broadcast together with shapes (5,) (3,)在这种情况下,您可以np.newaxis用来增加数组之一的尺寸,以便NumPy可以广播。
In [2]: x1_new = x1[:, np.newaxis]    # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])现在,添加:
In [3]: x1_new + x2
Out[3]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])另外,您也可以向数组添加新轴x2:
In [6]: x2_new = x2[:, np.newaxis]    # x2[:, None]
In [7]: x2_new     # shape is (3, 1)
Out[7]: 
array([[5],
       [4],
       [3]])现在,添加:
In [8]: x1 + x2_new
Out[8]: 
array([[ 6,  7,  8,  9, 10],
       [ 5,  6,  7,  8,  9],
       [ 4,  5,  6,  7,  8]])注意:请注意,在两种情况下我们都得到相同的结果(但一种是另一种的转置)。
方案3:这类似于方案1。但是,你可以使用np.newaxis不止一次地促进阵列更高的层面。有时对于高阶数组(即Tensors)需要这样的操作。
例:
In [124]: arr = np.arange(5*5).reshape(5,5)
In [125]: arr.shape
Out[125]: (5, 5)
# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis]    # arr[None, ..., None, None]
In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)关于np.newaxis和np.reshape的更多背景
newaxis 也称为伪索引,它允许将轴临时添加到多数组中。
np.newaxis使用切片运算符来重新创建阵列而np.reshape重塑阵列所需的布局(假设尺寸匹配;这是必须要reshape发生)。
例
In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape     # B[:, None, :]
Out[15]: (3, 4, 5, 6)在上面的示例中,我们在B(使用广播)的第一和第二轴之间插入了一个临时轴。此处使用缺失轴来填充,np.newaxis以使广播操作正常进行。
一般提示:您也可以None代替使用np.newaxis;这些实际上是相同的对象。
In [13]: np.newaxis is None
Out[13]: TruePS也看到了一个很好的答案:newaxis vs reshape添加尺寸
回答 1
什么np.newaxis啊
的np.newaxis仅仅是Python的常量的别名None,这意味着无论你使用np.newaxis,你也可以使用None:
>>> np.newaxis is None
True如果您阅读使用而不是的代码,则更具描述np.newaxis性None。
如何使用np.newaxis?
的np.newaxis,通常使用与切片。它表示您要向数组添加其他维度。的位置np.newaxis代表我要添加尺寸的位置。
>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)在第一个示例中,我使用第一个维度中的所有元素并添加第二个维度:
>>> a[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> a[:, np.newaxis].shape
(10, 1)第二个示例将一个维添加为第一维,然后将原始数组的第一维中的所有元素用作结果数组的第二维中的元素:
>>> a[np.newaxis, :]  # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)同样,您可以使用多个np.newaxis添加多个尺寸:
>>> a[np.newaxis, :, np.newaxis]  # note the 3 [] pairs in the output
array([[[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)有替代品np.newaxis吗?
NumPy:还有另一种非常相似的功能,np.expand_dims也可以用于插入一个尺寸:
>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]但是考虑到它只是在中插入1s,shape您也可以reshape在数组中添加以下尺寸:
>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[np.newaxis, :]大多数情况下np.newaxis,添加尺寸是最简单的方法,但是最好知道替代方法。
什么时候使用np.newaxis?
在某些情况下,添加尺寸很有用:
- 数据是否应具有指定的维数。例如,如果要 - matplotlib.pyplot.imshow用于显示一维数组。
- 如果您想让NumPy广播数组。通过添加维度,您可以例如获取一个数组的所有元素之间的差: - a - a[:, np.newaxis]。之所以可行,是因为NumPy操作从最后一个维度1开始广播。
- 添加必要的尺寸,以便NumPy 可以广播数组。这是可行的,因为每个length-1维仅被广播到另一个数组的对应1维的长度。 
1如果您想了解有关广播规则的更多信息,关于该主题的NumPy文档非常好。它还包括一个示例np.newaxis:
>>> a = np.array([0.0, 10.0, 20.0, 30.0]) >>> b = np.array([1.0, 2.0, 3.0]) >>> a[:, np.newaxis] + b array([[ 1., 2., 3.], [ 11., 12., 13.], [ 21., 22., 23.], [ 31., 32., 33.]])
回答 2
您从一维数字列表开始。使用完后numpy.newaxis,您将其转换为二维矩阵,每个矩阵由四行组成。
然后,您可以使用该矩阵进行矩阵乘法,或者将其用于构建更大的4 xn矩阵。
回答 3
newaxis选择元组中的object对象用于将结果选择的尺寸扩展一个单位长度尺寸。
这不仅仅是行矩阵到列矩阵的转换。
考虑下面的示例:
In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])现在让我们为数据添加新维度,
In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],
              [[4, 5, 6]],
              [[7, 8, 9]]])您可以newaxis在此处看到添加了额外的维度,x1的维度为(3,3),X1_new的维度为(3,1,3)。
我们的新维度如何使我们能够进行不同的操作:
In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 将x1_new和x2相加,我们得到:
In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
               [15, 17, 19],
               [18, 20, 22]],
              [[15, 17, 19],
               [18, 20, 22],
               [21, 23, 25]],
              [[18, 20, 22],
               [21, 23, 25],
               [24, 26, 28]]])因此,newaxis不仅仅是行到列矩阵的转换。它增加了矩阵的维数,从而使我们能够对其进行更多操作。


