例如
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]])
答案 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=1
和repeats=[2,3]
我们应该能够构建正确的take
索引(可能带有cumsum
)。切片不起作用。
但是如果我们只知道轴,并且重复未知,那么我们可能需要某种unique
或set
操作,如@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]]
你不需要知道轴和重复数量......