0

我正在尝试复制一个 numpy 数组的子集(进行图像背景减法 - 但这是通过)。我不明白以下有什么问题 - 我已经交互式地演示了它,因为你真的不想涉足我所有的代码......

>>> from numpy import zeros
>>> a = zeros((5,5,3), 'uint8')
>>> print a.shape
(5, 5, 3)
>>> b = a[1:2][1:2][:].copy()
>>> print b.shape
(0, 5, 3)
>>> print a[1:2][1:2][:].shape
(0, 5, 3)
>>> print a.shape
(5, 5, 3)
>>>

我想要的是 b.shape 返回 (2,2,3) -并在我需要对其进行的后续操作中以这种方式行事。我确定我做了一些非常明显的错误,但我不知道是什么。任何建议都感激不尽!

4

2 回答 2

3

我相信你的意思是a[1:3, 1:3, :]而不是a[1:2][1:2][:].

此外,a[1:3, 1:3, ...]也可以工作(...意思是“尽可能多:”)。NumPy 似乎也允许a[1:3, 1:3].

解释分为两部分:

  1. Python中的切片是左包右排的

  2. 逗号索引在这里是必要的,a[1:3]给你一个形状(2,5,3),另一个[1:3]将再次切穿第一个维度。

    对于简单的索引a[1][2][3]是一样的,a[1,2,3]因为每个连续的索引删除一个维度。但是,这不适用于切片 - 您需要使用逗号。

于 2013-04-25T14:41:35.157 回答
3

你正在做的事情有两个不同的问题。第一个是您如何在 numpy.xml 中处理索引。Numpy 矩阵有自己的语法,比您使用的列表语法列表更清晰......使用逗号而不是括号中的单独索引:

>>> from numpy import zeros
>>> a = zeros((5,5,3), 'uint8')
>>> print a[1:2,1:2,:].shape
(1, 1, 3)

相反,您正在做的是失败,因为 a[1:2] 仍然返回列表列表,因此您的下一个索引是外部列表(只有一个元素)上的索引,而不是您想要的内部列表:

>>> a[1:2]
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]], dtype=uint8)
>>> a[1:2][1:2]
array([], shape=(0, 5, 3), dtype=uint8)

(如果您使用简单索引而不是切片,则不会出现此问题,但您仍应使用逗号语法,因为它更清晰。

其次,您使用错误的切片。切片的第一个值是您想要的数组的第一个值的索引 - 并且索引从 0 开始。第二个值比您想要的数组的索引多一个。这样才能a[first_index:second_index]返回second_index-first_index积分。所以,你想要这样的东西:

>>> b = a[0:2,0:2,:]
>>> b
array([[[0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0]]], dtype=uint8)

您的索引[1:2]将只返回一个元素......列表中的第二个元素。

另外,作为旁注,.copy()这里是多余的,因为从 numpy 数组中获取切片已经创建了一个新对象。

于 2013-04-25T14:45:45.107 回答