【问题标题】:In numpy, what does selection by [:,None] do?在 numpy 中,[:,None] 的选择有什么作用?
【发布时间】:2016-06-16 18:58:33
【问题描述】:

我正在参加关于深度学习的 Udacity 课程,我遇到了以下代码:

def reformat(dataset, labels):
    dataset = dataset.reshape((-1, image_size * image_size)).astype(np.float32)
    # Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...]
    labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)
    return dataset, labels

labels[:,None] 在这里实际上做了什么?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

    numpy.newaxis

    newaxis 对象可用于所有切片操作以创建长度为 1 的轴。 :const: newaxis 是 ‘None’ 的别名,可以使用 ‘None’ 代替它,结果相同。

    http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.expand_dims.html

    用你的部分代码演示

    In [154]: labels=np.array([1,3,5])
    
    In [155]: labels[:,None]
    Out[155]: 
    array([[1],
           [3],
           [5]])
     
    In [157]: np.arange(8)==labels[:,None]
    Out[157]: 
    array([[False,  True, False, False, False, False, False, False],
           [False, False, False,  True, False, False, False, False],
           [False, False, False, False, False,  True, False, False]], dtype=bool)
    
    In [158]: (np.arange(8)==labels[:,None]).astype(int)
    Out[158]: 
    array([[0, 1, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 1, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0]])
    

    【讨论】:

      【解决方案2】:

      NoneNP.newaxis 的别名。它创建一个长度为 1 的轴。这对于矩阵乘法等很有用。

      >>>> import numpy as NP
      >>>> a = NP.arange(1,5)
      >>>> print a
      [1 2 3 4]
      >>>> print a.shape
      (4,)
      >>>> print a[:,None].shape
      (4, 1)
      >>>> print a[:,None]
      [[1]
       [2]
       [3]
       [4]]    
      

      【讨论】:

      • 所以它与 np.reshape(a, (-1,1)) 假设 a 的形状为 (n,) 相同,其中 n 是任意整数?
      • @BlueRineS 是的。
      【解决方案3】:

      用简单的英语解释,它允许在两个不同维数的数组之间进行操作。

      它通过添加一个新的空维度来实现这一点,该维度将自动适应另一个数组的大小。

      所以基本上如果:

      Array1 = 形状[100] 和 Array2 = 形状[10,100]

      Array1 * Array2 通常会报错。

      Array1[:,None] * Array2 可以工作。

      【讨论】:

        【解决方案4】:

        我在完成相同的 Udacity 课程后遇到完全相同的问题来到这里。我想做的是转置不适用于 numpy.transpose([1, 2, 3]) 的一维 numpy 系列/数组。 所以我想补充一下你可以像这样转置(source):

        numpy.matrix([1, 2, 3]).T
        

        结果:

        matrix([[1],
                [2],
                [3]])
        

        与以下内容几乎相同(类型不同):

        x=np.array([1, 2, 3])
        x[:,None]
        

        但我认为它更容易记住......

        【讨论】:

          【解决方案5】:

          如果您看到有经验的 NumPy 用户的代码,您会经常看到他们使用特殊的切片语法而不是调用 reshape。

          x = v[None, :]
          

          x = v[:, None]
          

          这些行创建了一个切片,它查看 v 的所有项目,但要求 NumPy 为关联的轴添加一个大小为 1 的新维度。

          【讨论】:

          • 内容来自 Udacity 的深度学习纳米学位项目。
          【解决方案6】:

          (澄清@GWW 的答案和@BlueRine S 的评论)在使用numpy 数组时,最好将一维数组清楚地视为行向量或列向量。 Andrew Ng 也指出了这一点,以避免代码中的错误。

          >>> import numpy as NP
          >>> a = NP.arange(1,5)
          >>> a
          array([1, 2, 3, 4])
          >>> a.shape
          (4,)
          >>> a[:,None].shape
          (4, 1)
          >>> a[:,None]
          array([[1],
                 [2],
                 [3],
                 [4]])
          >>> a[None,:].shape
          (1, 4)
          >>> a[None,:]
          array([[1, 2, 3, 4]])
          >>> np.reshape(a, (1, -1))
          array([[1, 2, 3, 4]])
          >>> np.reshape(a, (-1, 1))
          array([[1],
                 [2],
                 [3],
                 [4]])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-12
            • 2011-11-14
            • 1970-01-01
            • 2011-05-20
            • 2021-08-28
            相关资源
            最近更新 更多