【问题标题】:Is there an idiom or API for synchronized shuffling of Python arrays?是否有用于 Python 数组同步改组的习语或 API?
【发布时间】:2017-07-27 21:13:14
【问题描述】:

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

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

是否有实现此目的的 API 或 Python 习语?


请注意,将这些组合成一个 N 元组的单个数组,然后用 random.shuffle 打乱可能是我接受的一个选项,但我无法让它工作:取回原始数组是(尽可能接近)混乱,因为combined_array[:,0] 将具有以对象作为元素的维度(N,),而不是维度(N,A),除非它是manually rebuilt with something like[x for x in combined_array[:,0]

【问题讨论】:

    标签: python arrays numpy tensorflow


    【解决方案1】:
    permutation = numpy.random.permutation(N)
    
    arr1_shuffled = arr1[permutation]
    arr2_shuffled = arr2[permutation]
    

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

    【讨论】:

      【解决方案2】:

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

      这个总体思路可以应用于任何类型的集合,并且不限于 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])
      

      当然,您也可以使用它来创建具有新顺序的新列表/数组。

      【讨论】:

        猜你喜欢
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 2011-11-13
        相关资源
        最近更新 更多