如何使用 np.newaxis?

新手上路,请多包涵

什么是 numpy.newaxis 什么时候应该使用它?

在一维数组上使用它 x 产生:

 >>> x
array([0, 1, 2, 3])

>>> x[np.newaxis, :]
array([[0, 1, 2, 3]])

>>> x[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3]])

原文由 Yue Harriet Huang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 689
1 个回答

简单的说 numpy.newaxis 是用来将已有数组 的维度增加 一维,使用 一次。因此,

  • 一维 数组将变成 二维 数组
  • 2D 数组会变成 3D 数组
  • 3D 数组会变成 4D 数组
  • 4维 数组会变成 5维 数组

等等..

这是一个视觉插图,描述了从 1D 数组到 2D 数组的 提升

newaxis 画布可视化


场景 1np.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 将数组 提升 到更高的维度。高阶数组( _即张量_)有时需要这样的操作。

例子:

 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)

作为替代方案,您可以使用 numpy.expand_dims 具有直观的 axis kwarg。

 # adding new axes at 1st, 4th, and last dimension of the resulting array
In [131]: newaxes = (0, 3, -1)
In [132]: arr_5D = np.expand_dims(arr, axis=newaxes)
In [133]: arr_5D.shape
Out[133]: (1, 5, 5, 1, 1)

更多关于 np.newaxisnp.reshape 的背景

newaxis 也称为伪索引,允许将轴临时添加到多数组中。

np.newaxis 使用切片运算符重新创建数组,而 numpy.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]: True

PS 另请参阅这个很好的答案: newaxis vs reshape to add dimensions

原文由 kmario23 发布,翻译遵循 CC BY-SA 4.0 许可协议
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题