【问题标题】:Shape changing when slicing numpy arrayx切片numpy arrayx时形状改变
【发布时间】:2020-08-02 16:37:18
【问题描述】:

我以下面的数组为例:

lights = np.array([ [1,0,1], [0,1,1], [0,0,1], [1,1,1] ])

lights[0] 返回一个形状:(3,)

lights[0:1] 返回一个形状:(1, 3)

在这种情况下,我不明白 numpy 的逻辑是什么。 鉴于切片是独占的,[0:1] 类似于 [0]。 那么,为什么它会影响数组的形状呢?

【问题讨论】:

  • 如果lights 是一个列表而不是一个数组会怎样?
  • @hpaulj 我看不到你在这里的建议。如果它是一个列表,它没有形状,lights[0:1] 也不起作用。你能详细说明你想说什么吗?
  • 使用标量索引列表会删除嵌套级别。使用切片进行索引会保留嵌套级别。数组和列表的行为是一致的。
  • @hpaulj 这很有趣。我阅读了您的答案,并尝试在另一台计算机上对列表进行切片,就像我写第一篇评论时一样。你是对的,它是一样的。出于某种奇怪的原因,我在另一台计算机上遇到了错误。明天我得看看那里发生了什么。

标签: arrays numpy reshape


【解决方案1】:

https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#basic-slicing-and-indexing

整数 i 返回与 i:i+1 相同的值,但返回对象的维数减 1。特别是,第 p 个元素为整数的选择元组(以及所有其他条目: ) 返回维度为 N - 1 的相应子数组。如果 N = 1,则返回的对象是数组标量。这些对象在标量中进行了解释。

numpy 标量与切片索引与 Python 的列表索引一致:

In [119]: alist = [ [1,0,1], [0,1,1], [0,0,1], [1,1,1] ]                                               
In [120]: alist[0]                                                                                     
Out[120]: [1, 0, 1]     # one element of alist
In [121]: alist[0:1]                                                                                   
Out[121]: [[1, 0, 1]]    # a list with one element
In [122]: alist[0][1]    # nested selection of a number                                                     
Out[122]: 0

数组等价物,匹配使用 []:

In [123]: arr = np.array(alist)                                                                        
In [124]: arr                                                                                          
Out[124]: 
array([[1, 0, 1],
       [0, 1, 1],
       [0, 0, 1],
       [1, 1, 1]])
In [125]: arr[0]                                                                                       
Out[125]: array([1, 0, 1])
In [126]: arr[0:1]                                                                                     
Out[126]: array([[1, 0, 1]])
In [127]: arr[0,1]                                                                                     
Out[127]: 0

numpy 还可以使用元组、列表和数组进行索引。

【讨论】:

    【解决方案2】:

    lights 是形状为(4,3) 的二维数组。

    对于lights[0],您需要该数组的第一个元素,它本身是一个大小为 3 的一维数组。因此你得到了(3,)的形状。

    现在有了lights[0:1],你的做法就不同了。你切出一个子数组。即使这个子数组在一维中只包含一个元素,它仍然是一个二维数组。

    问问自己:如果您选择lights[0:2],会发生什么?你会期待一个形状为(2,3) 的二维数组,对吧?因此,即使lights[0:1] 返回的子数组可能与一维数组相同,NumPy 也不能只为您删除该维度。

    如果您键入类似lights[0:N] 的内容,其中 N 是一个变量,如果 N=1 则 NumPy 会自动下降一维,您每次都必须单独处理这种特殊情况。一个简单的例子,你想得到一个切片并设置它的第二个元素:

    N = 2
    t = lights[0:N]
    t[0, 1] = 42
    

    您可以将 N 设置为 1,它仍然有效。现在将其更改为t = lights[0],您的程序将在下一行崩溃,因为您的数组只有一维。因此,如果 NumPy 会删除 lights[0:1] 的额外维度,您每次都必须为这种特殊情况编写额外的代码。

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2018-07-23
      • 1970-01-01
      • 2012-09-18
      相关资源
      最近更新 更多