【问题标题】:Use numpy to get permutations of multiple lists' items使用 numpy 获取多个列表项的排列
【发布时间】:2017-06-08 21:54:59
【问题描述】:

例如,如果我有以下数组:

arraya = ['z', 'q']
arrayb = ['t', 'f']

我想使用每个列表中的项目来创建“对”并获得以下输出:

['zt', 'zf', 'qt', 'qf']

我知道我可以想出一个陪审团操纵的方法来编写一个产生这个结果的函数,但是一个预构建的函数会更好地满足我的目的。

【问题讨论】:

  • 乘法在数学上没有在向量运算中定义,这让我怀疑是否有为此预先构建的方法。看起来您将不得不暴力破解此方法,因为它具有相当特定的需求。
  • 您尝试将其用于什么应用程序,使您将此操作视为“乘法”?你是在尝试实现多项式乘法还是什么?
  • 抱歉,选词错误。对我不好。我更正确的意思是使用两个不同列表的项目,类似于数组项目排列。我会更新问题以反映这一点。

标签: arrays string python-3.x numpy


【解决方案1】:

这是尽可能接近内置的。

>>> import itertools
>>> [''.join(x) for x in itertools.product(arraya, arrayb)]
['zt', 'zf', 'qt', 'qf']

求 2 个列表/数组的笛卡尔积,然后连接该积。

【讨论】:

    【解决方案2】:

    没有内置函数,但您可以使用 senderle 的 cartesian_product 或 pv 的 cartesian 函数。哪个更快可能取决于您的用例。然后以下产生所需的结果:

    In [40]: cartesian_product([['z', 'q'], ['t', 'f']]).ravel().view('<U2')
    Out[40]: 
    array(['zt', 'zf', 'qt', 'qf'], 
          dtype='<U2')
    

    这些函数可以比使用itertools.product 更快。例如,

    In [181]: x, y = np.arange(500), np.arange(500)
    
    In [185]: %timeit cartesian_product([x, y])
    1000 loops, best of 3: 797 µs per loop
    
    In [184]: %timeit cartesian_product2([x, y])
    1000 loops, best of 3: 1.44 ms per loop
    
    In [186]: %timeit cartesian([x, y])
    100 loops, best of 3: 4.71 ms per loop
    
    In [100]: %timeit np.array(list(IT.product(x, y)))
    10 loops, best of 3: 112 ms per loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      相关资源
      最近更新 更多