【问题标题】:difference between A[0] and A[0:1] numpy arrays in pythonpython中A[0]和A[0:1] numpy数组的区别
【发布时间】:2018-05-05 23:00:10
【问题描述】:

我有一个像这样的 numpy 数组:

candidates = 

array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
        0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0],
       [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1,
        0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1],
       [1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
        0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0]])

而且我不明白candidates[0]有什么区别:

candidates[0] = 

array([1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
       0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]

candidates[0].shape = (34,)

还有candidates[0:1]:

candidates[0:1] = 

array([[1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0,
        0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]])

candidates[0:1].shape = (1, 34)

因为我相信两者应该给出完全相同的结果?我的意思是后者,即candidates[0:1] 应该只代表第一个元素,对吗?那么,这两者到底有什么区别呢?

【问题讨论】:

  • 和普通的Python切片一样:candidates[0]是第一个元素(本例中为第一行); candidates[0:1] 是第一个元素的集合(在这种情况下,是一个仅包含第一行的二维数组)。这就是形状不同的原因。比较lst = [1,2,3] 然后lst[0]lst[0:1]:一个是1,另一个是[1]
  • 嗨。这个问题已经讨论过了stackoverflow.com/questions/42882842/…
  • @decadenza 我不确定它是否是 dup,因为我不确定 OP 是否不清楚为什么 [0][0:1] 返回不同的形状,或者为什么 @ 987654338@ 和(1,34) 是不同的形状。链接的问题只回答后者。
  • @decadenza (另外,您链接的问题本身已作为this one 的副本关闭,我认为它有更好的答案 - 但幸运的是,如果我们想关闭它,我们可以链接两者。)
  • @abarnert 感谢您的回复!我知道[0][0:1] 之间的区别。我只需要了解后面的结果是一个二维数组。 Idk也许我应该从问题中删除“大小”一词以避免混淆?或者,如果您认为您可以改进我的措辞,请继续,因为英语不是我的第一语言哈哈。谢谢!

标签: python arrays numpy


【解决方案1】:

在 Python 中,[0]indexing——它返回第一个元素,而 [0:1]slicing——它返回所有前 1 个元素的集合.

使用简单的旧列表可能更容易看到:

>>> lst = [1, 2, 3]
>>> lst[0]
1
>>> lst[0:1]
[1]

Numpy 扩展了 Python 索引和切片,其中一些会因为不同的原因为您提供 2D 结果——例如,您可以使用 [0] 作为“类似数组”的索引,它可以用作索引数组) , 但这里的相关基础是一样的。对于 2D numpy 数组,元素是行,因此 candidates[0] 是第一行 - 一个 1D 数组,而 candidates[0:1] 是所有前 1 行的数组 - 一个 2D 数组。所以第一个形状为(34,),第二个形状为(1, 34)

如果不仔细看,可能差异并不明显,但比较一下两者的开始:

array([1,
array([[1,

它们没有排列,因为第二个有两个括号而不是一个,这是因为它是一个二维数组而不是一维数组。

【讨论】:

  • @jpp 实际上,它不是切片,而是使用类似数组的索引。而且我认为了解 numpy 扩展索引(和切片)的所有不同方式可能会使事情变得过于复杂。
  • @jpp 虽然也许至少值得在短语“Numpy 扩展索引和切片”中添加更多内容,以包括一个示例?
  • 是的 - 这可能会有所帮助。不确定最好的表达方式。
【解决方案2】:

区别在于维数:candidates[0:1] 将返回一个二维数组,而candidates[0] 将返回一个一维数组:

>>> candidates[0:1].ndim
2
>>> candidates[0].ndim
1

您还可以通过candidates[0:1] 的输出“看到”维数:注意到数组周围的方括号数量了吗?这些可以暗示数组的维度

【讨论】:

    【解决方案3】:

    没有。不同之处在于阵列的形状。在第一个实例中,您有一个一维数组。在第二个中,您有一个二维数组。

    您可以通过测试数组的shape 属性来进行测试:

    print(np.array([[1, 0]]).shape)
    (1, 2)
    
    print(np.array([1, 0]).shape)
    (2,)
    

    通过使用项目列表对数组进行切片,例如[0:1],您的结果将有一个额外的维度。请注意,这与使用范围无关;当您使用具有 1 个元素的列表作为索引器时也是如此:

    x = np.array([[0, 1], [2, 3]])
    
    print(x[[0]].shape)
    # (1, 2)
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2012-03-17
      • 2021-02-14
      • 2013-08-24
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2019-03-13
      相关资源
      最近更新 更多