【问题标题】:Numpy ndarray shape with 3 parameters具有 3 个参数的 Numpy ndarray 形状
【发布时间】:2018-07-10 09:31:02
【问题描述】:

当提供3个参数时,我对ndarray的形状感到困惑:

例如,有什么区别:

np.zeros((2, 1, 3))
array([[[ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.]]])

和:

np.zeros((1, 2, 3))
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

在我看来,它们都代表 2*3 矩阵。

【问题讨论】:

  • 维度 1 在这里是令人困惑的部分,因为您不容易看到维度 1。如果您尝试使用 (2, 3, 4),您将立即看到差异。您始终可以使用 array.shape 测试您的 numpy 数组。
  • 计算括号 - 3 组,而不是 2 组。它们传达了有关数组形状的真实信息。

标签: python arrays pandas numpy dataframe


【解决方案1】:

不行,形状不一样,要注意方括号

>>> np.zeros((2, 1, 3))
array([[[ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.]]])

对比:

>>> np.zeros((1, 2, 3))
array([[[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]]])

如您所见,在第一次调用中,我们有两次用于第二维的方括号,而在后者中,我们只有一个这样的对。

形状也不同:

>>> np.zeros((2, 1, 3)).shape
(2, 1, 3)
>>> np.zeros((1, 2, 3)).shape
(1, 2, 3)

所以在前者中我们有一个包含两个子列表的列表。这些子列表中的每一个都包含一个元素:三个元素的列表。在后者中,我们有一个包含一个元素的列表:一个包含两个元素的子列表,这两个元素是包含三个元素的列表。

所以 vanilla Python 列表等效项是:

[ [ [0, 0, 0] ], [ [0, 0, 0] ] ]

对比:

[ [ [0, 0, 0], [0, 0, 0] ] ]

【讨论】:

    【解决方案2】:

    dim=1 只是一个愚蠢的维度,您总是可以将2x3 的矩阵视为1x2x3 的张量。

    但是,从技术上讲,它们并不是一回事。所以你可以看到你的2输出中的括号[]并不完全相同,[]对于哑维度的位置不在同一位置。

    要删除哑维度,请使用

    arr = np.squeeze(arr)
    

    【讨论】:

      【解决方案3】:

      根据numpy.zeros documentation,第一个参数是表示数组形状的序列或整数。

      如果您仔细观察,嵌套的方括号与您构建的形状不同。

      这个例子可能会更清楚:

      np.zeros((2, 3, 4))
      
      array([[[ 0.,  0.,  0.,  0.],
              [ 0.,  0.,  0.,  0.],
              [ 0.,  0.,  0.,  0.]],
      
             [[ 0.,  0.,  0.,  0.],
              [ 0.,  0.,  0.,  0.],
              [ 0.,  0.,  0.,  0.]]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-13
        • 2019-10-31
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        相关资源
        最近更新 更多