我有下面的二维数组:
seq_length = 5
x = np.array([[0, 2, 0, 4], [5,6,7,8]])
x_repeated = np.repeat(x, seq_length, axis=1)
[[0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 4 4 4 4 4]
[5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 8]]
我想根据seq_length
对x_repeated
进行混洗,这样seq的所有项都将混洗在一起。
例如,可能的随机播放:
[[0 0 0 0 0 6 6 6 6 6 0 0 0 0 0 8 8 8 8 8]
[5 5 5 5 5 2 2 2 2 2 7 7 7 7 7 4 4 4 4 4]]
谢啦,谢啦
5条答案
按热度按时间idv4meu81#
你可以这样做:
您还可以利用
True
为非零值这一事实,将for
替换为:关键是我在
np.repeat
调用之前进行了shuffling/swapping,这比在调用之后进行要高效得多(同时满足了需要交换的值序列的要求),每对相同值的序列有50%的机会进行交换。6yoyoihd2#
设法解决它如下方式:
给出:
结果:
仍然不是那么优雅的
numpy
方式。gijlo24d3#
下面是我的尝试:
∮ ∮ ∮ ∮ ∮一个月一个月
首先我们要分组
然后,我们得到每个组的 * unique * 和 * count *。
最后,我们对唯一组进行
shuffle
,重构数组,并使用argsort
对混洗后的唯一组进行重新排序。示例用法:
rm5edbpk4#
cbwuti445#
下面是一个完全到位的解决方案,不需要分配和生成随机索引:
输出:
我所做的是创建与原始数组共享内存的"块":
然后我对每个"块"进行洗牌,这将反过来对原始数组进行洗牌。我相信这是对大型数组最有效的解决方案,因为这个解决方案是尽可能到位的。这个答案至少支持了我的假设:
https://stackoverflow.com/a/5044364/13091658
还有!你所面临的一般问题是排序数组的"滑动窗口视图",所以如果你想排序数组中水平和垂直移动的"窗口",你可以在这里看到我以前对滑动窗口相关问题的回答:
https://stackoverflow.com/a/67416335/13091658
https://stackoverflow.com/a/69924828/13091658