如何使用 np.newaxis?

2025-01-20 09:07:00
admin
原创
106
摘要:问题描述:它是什么?numpy.newaxis我应该何时使用它?在一维数组上使用它x会产生:>>> x array([0, 1, 2, 3]) >>> x[np.newaxis, :] array([[0, 1, 2, 3]]) >>> x[:, np...

问题描述:

它是什么?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]])

解决方案 1:

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

  • 一维数组将变为二维数组

  • 二维数组将变成三维数组

  • 3D数组将变为4D数组

  • 4D数组将变成5D数组

等等..

下面是一个直观的图示,描述了一维数组到二维数组的提升。

newaxis canva 可视化


场景 1np.newaxis当您想要将 1D 数组明确转换为行向量列向量时可能会派上用场,如上图所示。

例子:

# 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)

另外,您可以使用numpy.expand_dims具有直观axiskwarg 的。

# 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.newaxis与np.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

解决方案 2:

什么是np.newaxis

只是np.newaxisPython 常量的别名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, :]

但鉴于它只是在数组1中插入 s,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可以广播数组。这是可行的,因为每个长度为 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.]])

解决方案 3:

你从一维数字列表开始。使用后numpy.newaxis,你将其变成二维矩阵,由四行每列组成。

然后,您可以使用该矩阵进行矩阵乘法,或将其参与构建更大的 4 xn 矩阵。

解决方案 4:

newaxis选择元组中的对象用于将结果选择的维度扩展一个单位长度维度。

它不仅仅是行矩阵到列矩阵的转换。

请考虑以下示例:

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这不仅仅是将行矩阵转换为列矩阵。它增加了矩阵的维度,从而使我们能够对其进行更多操作。

解决方案 5:

它会扩大其所在位置的暗淡程度。

例如:arr[newaxis]等于expand_dims(arr, 0)

arr[:, newaxis]等于expand_dims(arr, 1)

arr[:, :, newaxis]等于expand_dims(arr, 2)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2059  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1456  
  PLM(产品生命周期管理)软件在汽车行业正发挥着日益重要的作用,它贯穿于汽车从概念设计到退役处理的整个生命周期,为汽车企业提升效率、降低成本、提高产品质量提供了强大的支持。通过实际应用案例的解析,能更直观地了解PLM软件在汽车行业的价值与影响。PLM软件助力汽车设计创新在汽车设计阶段,PLM软件为设计师提供了一个协同的...
plm项目管理系统   0  
  企业数字化转型已成为当今众多企业寻求突破与发展的关键战略。在这一进程中,产品生命周期管理(PLM)系统发挥着至关重要的作用。PLM系统涵盖了从产品概念设计到产品退役的全生命周期管理,通过整合数据、流程和人员,为企业数字化转型提供了强大的支持。它不仅能提升企业内部的协同效率,还能优化产品创新流程,增强企业对市场变化的响应...
plm软件   2  
  产品生命周期管理(PLM)系统旨在整合产品从概念设计到退役的全生命周期数据与流程,助力企业提升创新能力、缩短产品上市时间、降低成本。然而,在PLM系统实施过程中,企业往往会遭遇诸多挑战。这些挑战若得不到妥善解决,将严重影响系统的实施效果与企业的业务发展。接下来,我们深入探讨PLM系统实施过程中常见的三大挑战。业务流程与...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用