Python 如何洗牌隐式对数组?
我正在尝试在一系列图像中进行成对洗牌,这对我来说有点棘手 例如: 我有20个图像序列,每个包含1000帧。。它们保存在一个数组中。。让我们假设,数组是这样的Python 如何洗牌隐式对数组?,python,arrays,shuffle,Python,Arrays,Shuffle,我正在尝试在一系列图像中进行成对洗牌,这对我来说有点棘手 例如: 我有20个图像序列,每个包含1000帧。。它们保存在一个数组中。。让我们假设,数组是这样的 [[1_1],[1_2],[1_3],[1_4],[1_5],[1_6],[2_1],[2_2],[2_3],[2_4],[2_5],[2_6],[3_1],[3_2],[3_3],[3_4],[3_5],[3_6]] [[1_4],[1_5],[2_3],[2_4],[3_5],[3_6],[1_3],[1_4],[1_1],[1_2]
[[1_1],[1_2],[1_3],[1_4],[1_5],[1_6],[2_1],[2_2],[2_3],[2_4],[2_5],[2_6],[3_1],[3_2],[3_3],[3_4],[3_5],[3_6]]
[[1_4],[1_5],[2_3],[2_4],[3_5],[3_6],[1_3],[1_4],[1_1],[1_2],[3_2],[3_3],[1_2],[1_3],[3_3],[3_4],[2_1],[2_2] ....]
以此类推,这只是3个序列的最小示例,每个序列有6帧。。但我最终想要实现的是,顺序帧的洗牌,诸如此类
[[1_1],[1_2],[1_3],[1_4],[1_5],[1_6],[2_1],[2_2],[2_3],[2_4],[2_5],[2_6],[3_1],[3_2],[3_3],[3_4],[3_5],[3_6]]
[[1_4],[1_5],[2_3],[2_4],[3_5],[3_6],[1_3],[1_4],[1_1],[1_2],[3_2],[3_3],[1_2],[1_3],[3_3],[3_4],[2_1],[2_2] ....]
所以像这样的事情很简单。。所以我想产生一个洗牌,但不是单个元素,而是每个元素和后面的元素,也就是说,我想洗牌成对的元素
有什么方法可以做到这一点吗?我正在开发一个更干净的嵌套列表(不信任
[1\u 1]
):
然后,我创建一个嵌套列表,即一个成对列表,包含以下内容:
S=[[L[z*2+y] for y in range(2)] for z in range(len(L)//2)] # version 1
S=[[L[z+y] for y in range(2)] for z in range(len(L)-1)] # version 2
S
请注意,存在长度为1/2的非重叠对,
但N-1对重叠(每个条目一对,最后一对除外)
请注意,在下面的所有输出中,我都手动添加了换行符以提高可读性
和清晰的目的
此时的输出为:
版本1,非重叠对:
[[['1_1'], ['1_2']],
[['1_3'], ['1_4']],
[['1_5'], ['1_6']],
[['2_1'], ['2_2']],
[['2_3'], ['2_4']],
[['2_5'], ['2_6']],
[['3_1'], ['3_2']],
[['3_3'], ['3_4']],
[['3_5'], ['3_6']]]
[[['1_1'], ['1_2']],
[['1_2'], ['1_3']],
[['1_3'], ['1_4']],
[['1_4'], ['1_5']],
[['1_5'], ['1_6']],
[['1_6'], ['2_1']],
[['2_1'], ['2_2']],
[['2_2'], ['2_3']],
[['2_3'], ['2_4']],
[['2_4'], ['2_5']],
[['2_5'], ['2_6']],
[['2_6'], ['3_1']],
[['3_1'], ['3_2']],
[['3_2'], ['3_3']],
[['3_3'], ['3_4']],
[['3_4'], ['3_5']],
[['3_5'], ['3_6']]]
[['3_3'], ['3_4'], ['3_1'], ['3_2'], ['2_3'], ['2_4'],
['3_5'], ['3_6'], ['1_1'], ['1_2'], ['1_3'], ['1_4'],
['2_1'], ['2_2'], ['1_5'], ['1_6'], ['2_5'], ['2_6']]
[['1_2'], ['1_3'], ['2_1'], ['2_2'], ['2_4'], ['2_5'],
['2_2'], ['2_3'], ['1_3'], ['1_4'], ['3_4'], ['3_5'],
['3_3'], ['3_4'], ['3_2'], ['3_3'], ['1_6'], ['2_1'],
['2_5'], ['2_6'], ['2_6'], ['3_1'], ['1_4'], ['1_5'],
['1_1'], ['1_2'], ['2_3'], ['2_4'], ['1_5'], ['1_6'],
['3_1'], ['3_2'], ['3_5'], ['3_6']]
版本2,重叠对:
[[['1_1'], ['1_2']],
[['1_3'], ['1_4']],
[['1_5'], ['1_6']],
[['2_1'], ['2_2']],
[['2_3'], ['2_4']],
[['2_5'], ['2_6']],
[['3_1'], ['3_2']],
[['3_3'], ['3_4']],
[['3_5'], ['3_6']]]
[[['1_1'], ['1_2']],
[['1_2'], ['1_3']],
[['1_3'], ['1_4']],
[['1_4'], ['1_5']],
[['1_5'], ['1_6']],
[['1_6'], ['2_1']],
[['2_1'], ['2_2']],
[['2_2'], ['2_3']],
[['2_3'], ['2_4']],
[['2_4'], ['2_5']],
[['2_5'], ['2_6']],
[['2_6'], ['3_1']],
[['3_1'], ['3_2']],
[['3_2'], ['3_3']],
[['3_3'], ['3_4']],
[['3_4'], ['3_5']],
[['3_5'], ['3_6']]]
[['3_3'], ['3_4'], ['3_1'], ['3_2'], ['2_3'], ['2_4'],
['3_5'], ['3_6'], ['1_1'], ['1_2'], ['1_3'], ['1_4'],
['2_1'], ['2_2'], ['1_5'], ['1_6'], ['2_5'], ['2_6']]
[['1_2'], ['1_3'], ['2_1'], ['2_2'], ['2_4'], ['2_5'],
['2_2'], ['2_3'], ['1_3'], ['1_4'], ['3_4'], ['3_5'],
['3_3'], ['3_4'], ['3_2'], ['3_3'], ['1_6'], ['2_1'],
['2_5'], ['2_6'], ['2_6'], ['3_1'], ['1_4'], ['1_5'],
['1_1'], ['1_2'], ['2_3'], ['2_4'], ['1_5'], ['1_6'],
['3_1'], ['3_2'], ['3_5'], ['3_6']]
然后洗牌S,这将只洗牌S内的对,而不是对内的对,这是制作对列表的第一点
import random
random.shuffle(S)
S
此时的输出,当然仍然是嵌套的:
非重叠随机对:
[[['3_3'], ['3_4']],
[['3_1'], ['3_2']],
[['2_3'], ['2_4']],
[['3_5'], ['3_6']],
[['1_1'], ['1_2']],
[['1_3'], ['1_4']],
[['2_1'], ['2_2']],
[['1_5'], ['1_6']],
[['2_5'], ['2_6']]]
[[['1_2'], ['1_3']],
[['2_1'], ['2_2']],
[['2_4'], ['2_5']],
[['2_2'], ['2_3']],
[['1_3'], ['1_4']],
[['3_4'], ['3_5']],
[['3_3'], ['3_4']],
[['3_2'], ['3_3']],
[['1_6'], ['2_1']],
[['2_5'], ['2_6']],
[['2_6'], ['3_1']],
[['1_4'], ['1_5']],
[['1_1'], ['1_2']],
[['2_3'], ['2_4']],
[['1_5'], ['1_6']],
[['3_1'], ['3_2']],
[['3_5'], ['3_6']]]
输出重叠随机对:
[[['3_3'], ['3_4']],
[['3_1'], ['3_2']],
[['2_3'], ['2_4']],
[['3_5'], ['3_6']],
[['1_1'], ['1_2']],
[['1_3'], ['1_4']],
[['2_1'], ['2_2']],
[['1_5'], ['1_6']],
[['2_5'], ['2_6']]]
[[['1_2'], ['1_3']],
[['2_1'], ['2_2']],
[['2_4'], ['2_5']],
[['2_2'], ['2_3']],
[['1_3'], ['1_4']],
[['3_4'], ['3_5']],
[['3_3'], ['3_4']],
[['3_2'], ['3_3']],
[['1_6'], ['2_1']],
[['2_5'], ['2_6']],
[['2_6'], ['3_1']],
[['1_4'], ['1_5']],
[['1_1'], ['1_2']],
[['2_3'], ['2_4']],
[['1_5'], ['1_6']],
[['3_1'], ['3_2']],
[['3_5'], ['3_6']]]
也许你可以在项目的其余部分使用它。如果没有,就把这对溶解掉
L2=[]
for x in S:
for y in x:
L2.append(y)
print(L2)
输出非重叠对:
[[['1_1'], ['1_2']],
[['1_3'], ['1_4']],
[['1_5'], ['1_6']],
[['2_1'], ['2_2']],
[['2_3'], ['2_4']],
[['2_5'], ['2_6']],
[['3_1'], ['3_2']],
[['3_3'], ['3_4']],
[['3_5'], ['3_6']]]
[[['1_1'], ['1_2']],
[['1_2'], ['1_3']],
[['1_3'], ['1_4']],
[['1_4'], ['1_5']],
[['1_5'], ['1_6']],
[['1_6'], ['2_1']],
[['2_1'], ['2_2']],
[['2_2'], ['2_3']],
[['2_3'], ['2_4']],
[['2_4'], ['2_5']],
[['2_5'], ['2_6']],
[['2_6'], ['3_1']],
[['3_1'], ['3_2']],
[['3_2'], ['3_3']],
[['3_3'], ['3_4']],
[['3_4'], ['3_5']],
[['3_5'], ['3_6']]]
[['3_3'], ['3_4'], ['3_1'], ['3_2'], ['2_3'], ['2_4'],
['3_5'], ['3_6'], ['1_1'], ['1_2'], ['1_3'], ['1_4'],
['2_1'], ['2_2'], ['1_5'], ['1_6'], ['2_5'], ['2_6']]
[['1_2'], ['1_3'], ['2_1'], ['2_2'], ['2_4'], ['2_5'],
['2_2'], ['2_3'], ['1_3'], ['1_4'], ['3_4'], ['3_5'],
['3_3'], ['3_4'], ['3_2'], ['3_3'], ['1_6'], ['2_1'],
['2_5'], ['2_6'], ['2_6'], ['3_1'], ['1_4'], ['1_5'],
['1_1'], ['1_2'], ['2_3'], ['2_4'], ['1_5'], ['1_6'],
['3_1'], ['3_2'], ['3_5'], ['3_6']]
输出重叠对:
[[['1_1'], ['1_2']],
[['1_3'], ['1_4']],
[['1_5'], ['1_6']],
[['2_1'], ['2_2']],
[['2_3'], ['2_4']],
[['2_5'], ['2_6']],
[['3_1'], ['3_2']],
[['3_3'], ['3_4']],
[['3_5'], ['3_6']]]
[[['1_1'], ['1_2']],
[['1_2'], ['1_3']],
[['1_3'], ['1_4']],
[['1_4'], ['1_5']],
[['1_5'], ['1_6']],
[['1_6'], ['2_1']],
[['2_1'], ['2_2']],
[['2_2'], ['2_3']],
[['2_3'], ['2_4']],
[['2_4'], ['2_5']],
[['2_5'], ['2_6']],
[['2_6'], ['3_1']],
[['3_1'], ['3_2']],
[['3_2'], ['3_3']],
[['3_3'], ['3_4']],
[['3_4'], ['3_5']],
[['3_5'], ['3_6']]]
[['3_3'], ['3_4'], ['3_1'], ['3_2'], ['2_3'], ['2_4'],
['3_5'], ['3_6'], ['1_1'], ['1_2'], ['1_3'], ['1_4'],
['2_1'], ['2_2'], ['1_5'], ['1_6'], ['2_5'], ['2_6']]
[['1_2'], ['1_3'], ['2_1'], ['2_2'], ['2_4'], ['2_5'],
['2_2'], ['2_3'], ['1_3'], ['1_4'], ['3_4'], ['3_5'],
['3_3'], ['3_4'], ['3_2'], ['3_3'], ['1_6'], ['2_1'],
['2_5'], ['2_6'], ['2_6'], ['3_1'], ['1_4'], ['1_5'],
['1_1'], ['1_2'], ['2_3'], ['2_4'], ['1_5'], ['1_6'],
['3_1'], ['3_2'], ['3_5'], ['3_6']]
我们需要一些导入来简化事情:
from functools import reduce
from itertools import groupby
import operator
import random
假设您有如下列表:
ar = [['1_1'],['1_2'],['1_3'],['1_4'],['1_5'],['1_6'],['2_1'],['2_2'],['2_3'],['2_4'],['2_5'],['2_6'],['3_1'],['3_2'],['3_3'],['3_4'],['3_5'],['3_6']]
我们可以首先按图像对它们进行分组,以便只生成有效对:
groupedbyimage = [list(g[1]) for g in groupby(ar, lambda x: x[0][0])]
在您的情况下,上述lambda必须是其他的,以便在不只是比较嵌套列表中字符串中的第一个字母时生成并查找正确的组
接下来,我们可以压缩图像列表,并将其自身移动一个位置:
groupedandpaired = [list(zip(x, x[1:])) for x in groupedbyimage]
我们现在可以将groupedandpaired
列表展平为pairlist
:
pairlist = reduce(operator.concat, groupedandpaired)
现在,我们可以洗牌配对列表,然后再次将其展平以获得所需的结果:
random.shuffle(pairlist)
result = list(reduce(operator.concat, pairlist))
在REPL中打印结果时,我们会看到如下内容:
>>> result
[['1_5'], ['1_6'], ['2_1'], ['2_2'], ['1_1'], ['1_2'], ['3_2'],
['3_3'], ['2_2'], ['2_3'], ['3_5'], ['3_6'], ['3_1'], ['3_2'],
['1_3'], ['1_4'], ['1_4'], ['1_5'], ['3_4'], ['3_5'], ['3_3'],
['3_4'], ['2_5'], ['2_6'], ['2_3'], ['2_4'], ['1_2'], ['1_3'],
['2_4'], ['2_5']]
[1_1]
令人困惑,你是说['1_1']
?我只是指第一个序列中的第一个图像。。没什么了——实际上1_1
是一个3D数组(RGB图像),一个对['1_1']
有效的答案会有帮助吗?你能给我一个你所指答案的例子吗?我认为这是“是”。但这不是我想要的,这里你把整个序列洗牌了,所以如果我有6个从1到6排列的序列,然后你要做的是像这样做1,3,6,4,5例如,我想要的是,我在图像序列中洗牌帧本身,如上面的例子所示。不,它只洗牌整个6组,不在,你可以在我提供的输出中看到。是的,这就是我要说的。。这不是我想要的你只是想洗牌而不保留那六组?这有什么特别之处?请尝试S=[[L[z+y]表示范围(2)中的y]表示范围(len(L)-1)]
。