是否存在用于同步改组Python数组的习惯用法或API?

时间:2017-07-27 21:13:14

标签: python arrays numpy tensorflow

NumPy(或者可能是TensorFlow)中是否有API用于执行多个阵列的同步混洗(具有相同的第一维)?

例如,如果我有两个具有维度(N,A)和(N,B)的数组,并且我想随机化每个N个元素的排序,同时保持第一个数组的元素之间的关联,第二个。

是否有用于完成此操作的API或Python习惯用法?

请注意,将这些组合成N个元组的单个数组,然后使用random.shuffle进行混洗可能是我接受的一个选项,但是我无法让它工作:恢复原始数组(尽管我已经管理过了)凌乱,因为combined_array[:,0]将维度(N,)与对象作为元素,而不是维度(N,A),除非它是{ {3}} [x for x in combined_array[:,0]

2 个答案:

答案 0 :(得分:4)

permutation = numpy.random.permutation(N)

arr1_shuffled = arr1[permutation]
arr2_shuffled = arr2[permutation]

选择一个排列并将其用于两个数组。

答案 1 :(得分:0)

一种简单的解决方法,无需触摸或组合原始集合即可使用随机化的双射函数,该函数映射到数组中元素的索引。然后,您可以使用该函数(映射)并将其应用于两个(或任何数字)数组以获得混洗结果。

这个一般的想法可以应用于任何类型的集合,并不仅限于Numpy数组。

执行此操作的最简单方法是使用所有索引的随机列表,然后,随机迭代同步数组,只需遍历混洗索引列表并访问当前索引处的元素:

from random import shuffle

# These would be your input lists (or arrays, doesn’t really matter)
list1 = […]
list2 = […]

# generate a list of all indexes
indexes = list(range(len(list1)))

# shuffle the indexes
shuffle(indexes)

for i in indexes:
    print(list1[i], list2[i])

当然您也可以使用它来创建新订单的新列表/数组。