在NumPy中删除每个其他元素

7

我怎么也想不出来这个问题的解决方法。

我正在尝试删除数组第二轴中每隔一个元素。在MATLAB中,我使用了arr(:,:,2:2:end) = [];,但是当我尝试在Python中进行同样的操作并比较两个输出时,得到了一个不同的矩阵。

我尝试过arr = np.delete(arr,np.arange(0,arr.shape[2],2),2)arr = arr[:,:,1::2],但是都没有得到我在MATLAB中得到的结果。



示例:

MATLAB

    disp(['before: ',str(arr[21,32,11])])
    arr(:,:,2:2:end) = [];
    disp(['after: ',str(arr[21,32,11])])

输出:

    before: 99089
    after: 65699

Python
    print 'before: ' + str(arr[20,31,10])
    arr = arr[:,:,1::2] # same output as np.delete(arr,np.arange(0,arr.shape[2],2),2) 
    print 'after: ' + str(arr[20,31,10])

输出:

    before: 99089
    after: 62360

我希望我没有忽视某些基本的东西。

1
arr = arr[:,:,::2]怎么样? - Divakar
1
好的,[1::2][1] 即第二个元素开始索引,但你想要从第一个即 [0] 元素开始。因此,你可以使用 arr = arr[:,:,0::2] 来达到同样的效果。 - Divakar
@Divakar,实际上,我意识到我在我的MATLAB示例中打了一个错误字。它应该是 arr(:,:,2:2:end) = []; (我不确定我是如何搞砸的)。无论如何,你的答案似乎修复了我遇到的问题,但是如果我想与MATLAB匹配,我是否应该从Python的[1]th开始? - David
通过 arr[:,:,::2] 我们选择元素,通过 =[]; 我们删除内容。这样做有点像翻转了事情。 - Divakar
@David - 在MATLAB中,您正在移除每个偶数片,这与选择每个奇数片相同。在numpy中,Divakar仅选择每个奇数片,而在MATLAB中,您正在删除每个偶数片。这两个操作是等效的,但一个是选择元素,而另一个是删除元素。最好选择在数组中选择元素,而不是将它们删除。对于较大的矩阵,它所需的时间也很昂贵。 - rayryeng
显示剩余2条评论
1个回答

4
你正在尝试删除最后一个轴上从第二个元素开始的每个其他元素。换句话说,你正在尝试保留该轴上从第一个元素开始的每个其他元素。
因此,反向选择元素而不是删除元素,MATLAB代码arr(:,:,2:2:end) = []等效于(忽略性能数字):
arr = arr(:,:,1:2:end)

在Python/NumPy中,这将是:
arr = arr[:,:,0::2]

或者简单地说:

arr = arr[:,:,::2]

啊,现在我完全明白了!谢谢你花时间解释 :) - David
@David 太棒了,酷! - Divakar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接