python中是否有任何函数可以执行numpy.repeat函数的反转?

时间:2016-08-02 13:38:33

标签: python python-2.7 numpy

例如

x = np.repeat(np.array([[1,2],[3,4]]), 2, axis=1)

给你

x = array([[1, 1, 2, 2],
          [3, 3, 4, 4]])

但是有什么可以执行

 x = np.*inverse_repeat*(np.array([[1, 1, 2, 2],[3, 3, 4, 4]]), axis=1)

并给你

x = array([[1,2],[3,4]])

4 个答案:

答案 0 :(得分:5)

定期切片应该有效。对于要反向重复的轴,请使用::number_of_repetitions

x = np.repeat(np.array([[1,2],[3,4]]), 4, axis=0)
x[::4, :]  # axis=0
Out: 
array([[1, 2],
       [3, 4]])

x = np.repeat(np.array([[1,2],[3,4]]), 3, axis=1)

x[:,::3]  # axis=1
Out: 
array([[1, 2],
       [3, 4]])


x = np.repeat(np.array([[[1],[2]],[[3],[4]]]), 5, axis=2)
x[:,:,::5]  # axis=2
Out: 
array([[[1],
        [2]],

       [[3],
        [4]]])

答案 1 :(得分:0)

这应该有效,并且与np.repeat具有完全相同的签名:

def inverse_repeat(a, repeats, axis):
    if isinstance(repeats, int):
        indices = np.arange(a.shape[axis] / repeats, dtype=np.int) * repeats
    else:  # assume array_like of int
        indices = np.cumsum(repeats) - 1
    return a.take(indices, axis)

编辑:添加了对每个项目重复的支持,类似于np.repeat

答案 2 :(得分:0)

对于我们知道轴和重复的情况 - 并且repeat是标量(所有元素的值相同),我们可以像这样构造切片索引:

In [1117]: a=np.array([[1, 1, 2, 2],[3, 3, 4, 4]])
In [1118]: axis=1; repeats=2

In [1119]: ind=[slice(None)]*a.ndim
In [1120]: ind[axis]=slice(None,None,a.shape[axis]//repeats)
In [1121]: ind
Out[1121]: [slice(None, None, None), slice(None, None, 2)]
In [1122]: a[ind]
Out[1122]: 
array([[1, 2],
       [3, 4]])

@Eelco's使用take可以更容易地将焦点放在一个轴上,但需要一个索引列表,而不是一个切片。

但是repeat确实允许不同的重复计数。

In [1127]: np.repeat(a1,[2,3],axis=1)
Out[1127]: 
array([[1, 1, 2, 2, 2],
       [3, 3, 4, 4, 4]])

了解axis=1repeats=[2,3]我们应该能够构建正确的take索引(可能带有cumsum)。切片不起作用。

但是如果我们只知道轴,并且重复未知,那么我们可能需要某种uniqueset操作,如@redratear's回答。

In [1128]: a2=np.repeat(a1,[2,3],axis=1)
In [1129]: y=[list(set(c)) for c in a2]
In [1130]: y
Out[1130]: [[1, 2], [3, 4]]

列表为take的{​​{1}}解决方案。这应该选择每个重复块的最后一个:

repeats

删除的答案使用In [1132]: np.take(a2,np.cumsum([2,3])-1,axis=1) Out[1132]: array([[1, 2], [3, 4]]) ;这是我逐行使用unique

unique

In [1136]: np.array([np.unique(row) for row in a2]) Out[1136]: array([[1, 2], [3, 4]]) 对于此用途优于unique,因为它维护了元素顺序。 set(或设置)还有另一个问题 - 如果原件有重复值,例如unique

这种情况很难从结果中推导出重复模式。我必须先查看所有行。

[[1,2,1,3],[3,3,4,1]]

In [1169]: a=np.array([[2,1,1,3],[3,3,2,1]]) In [1170]: a1=np.repeat(a,[2,1,3,4], axis=1) In [1171]: a1 Out[1171]: array([[2, 2, 1, 1, 1, 1, 3, 3, 3, 3], [3, 3, 3, 2, 2, 2, 1, 1, 1, 1]]) 对已知重复进行了很好的解决:

cumsum

答案 3 :(得分:-1)

>>> import numpy as np
>>> x = np.repeat(np.array([[1,2],[3,4]]), 2, axis=1)
>>> y=[list(set(c)) for c in x] #This part remove duplicates for each array in tuple. So this will not work for x = np.repeat(np.array([[1,1],[3,3]]), 2, axis=1)=[[1,1,1,1],[3,3,3,3]. Result will be [[1],[3]]
>>> print y
[[1, 2], [3, 4]]

你不需要知道轴和重复数量......