当前位置: 首页 > 知识库问答 >
问题:

numpy是怎么做的。newaxis工作以及何时使用它?

屈健柏
2023-03-14

当我尝试

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,我们应该在什么情况下使用它?

共有3个答案

冯宏浚
2023-03-14

您从一维数字列表开始。一旦你使用了numpy。newaxis,将其转换为二维矩阵,由四行各一列组成。

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

南门向荣
2023-03-14

np。newaxis只是Python常量None的别名,这意味着无论您在哪里使用np。newaxis您也可以使用None

>>> np.newaxis is None
True

如果您阅读使用np的代码,它会更具描述性。newaxis而不是None

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)

NumPy中还有另一个非常类似的功能:np。展开_dims,也可用于插入一个尺寸:

>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

但考虑到它只是在形状中插入1s,您还可以重塑数组以添加以下维度:

>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[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.]])
    

  • 丁淇
    2023-03-14

    简单地说,numpy。newaxis用于在使用一次时将现有数组的维度再增加一个维度。因此

    >

  • 1D阵列将变成2D阵列

    二维阵列将变为三维阵列

    3D阵列将变成4D阵列

    4D阵列将变成5D阵列

    等等...

    这是一个直观的插图,描述了将一维阵列提升为二维阵列的过程。

    情景1:np。如上图所示,当您想要将1D数组显式转换为行向量或列向量时,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)
    

    作为一种选择,您可以使用具有直观kwarg的numpy.expand_dims

    # 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时重新创建数组。重塑将阵列重塑为所需布局(假设尺寸匹配;这是重塑所必须的)。

    示例

    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填充缺少的轴,以使广播操作正常工作。

    一般提示:您也可以使用代替np.newaxis;这些实际上是相同的对象

    In [13]: np.newaxis is None
    Out[13]: True
    

    P. S.也可以看到这个伟大的答案: newaxis vs reshape以增加维度

  •  类似资料:
    • 问题内容: 经常出现在Python模块中。即使阅读了Python的文档,我也不明白它的用途以及使用时间/方式。 有人可以举例说明吗? 关于我收到的基本用法的一些答案似乎是正确的。 但是,我需要了解有关工作原理的另一件事: 对我来说,最令人困惑的概念是当前的python版本如何包含未来版本的功能,以及如何使用当前版本的Python成功地编译使用未来版本的功能的程序。 我猜想当前版本包含了将来的潜在功

    • 我现在正在尝试学习Spring Security,我已经看到了许多使用它的不同例子。我知道CSRF是什么,Spring Security默认启用了它。我很想知道的是这种定制。 这一行是什么样的定制,以及何时适合使用它。如果有人能给我一个简单的解释,我将不胜感激。

    • 问题内容: 在numpy中,可以使用切片语法中的’newaxis’对象创建长度为1的轴,例如: 该文档的状态是一个也可以用代替,效果是完全一样的。 有什么理由选择一个?是否有一般偏好或样式指南?我的印象是更受欢迎,可能是因为它更明确。那么,有什么理由允许这样做? 问题答案: 之所以被允许,是因为它仅仅是的别名。 作者之所以选择它,是因为他们需要一个方便的常量并且可用。 至于为什么你应该更喜欢过:主

    • 我看到它包含了DejaVu Sans字体,但我不知道如何使用这个jar(我在网上什么也没有找到),也不知道这是否能以一种优雅、简单的方式解决我的跨平台软件。 你能告诉我更多关于这个罐子的事吗?

    • 问题内容: 我正在尝试自己学习Socket。我对Oracle网站上的文字感到有些困惑。我对此有一些疑问。在此先感谢您的明确解释。 setSoTimeout 公共无效setSoTimeout(int超时)引发SocketException 以指定的超时时间启用/禁用SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时后,与此套接字关联的调用将仅在此时间量内阻塞。如果超时到期,则尽管Socket

    • 何时扩展RecyclerView.Adapter以及它是如何工作的? 我理解一段代码有困难。有人能解释一下这个方法什么时候扩展,它是用来做什么的吗?