Numpy数组子集意外行为

2024-04-27 00:09:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图复制一个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)-并在接下来的操作中以这种方式进行操作。我肯定我做了一些非常明显的错误,但我不知道是什么。如有任何建议,不胜感激!在


Tags: 代码from图像importnumpy错误zeros数组
2条回答

我相信你是说a[1:3, 1:3, :]而不是{}。在

而且,a[1:3, 1:3, ...]也可以(...意思是“根据需要尽可能多的:”)。NumPy似乎也允许a[1:3, 1:3]。在

解释分为两部分:

  1. Python中的切片是左包含和右独占的

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

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

你所做的有两个不同的问题。主要的问题是如何在numpy中处理索引。Numpy矩阵有自己的语法,比您使用的列表语法要清楚得多。。。在括号中使用逗号而不是单独的索引:

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

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

^{pr2}$

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

第二,你用错了切片。切片的第一个值是所需数组的第一个值的索引,索引从0开始。第二个值比所需数组的索引多1个。这使得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数组获取切片已经创建了一个新对象。在

相关问题 更多 >