【问题标题】:Find with python numpy the amount of combinations in tuple用python numpy查找元组中的组合数量
【发布时间】:2017-11-27 23:32:47
【问题描述】:

我有一个元组(1,2,5,3,2,1,3,4,1),想找出12 的组合数量。所以在这个例子中它应该返回2,因为1有3次,但2只有2次。

我要解决的任务是:

通过12 给出可能组合的数量。每个数字只能用于组合一次。

我已经用这段代码解决了这个问题:

    count1 = tuple.count(number1)
    count2 = tuple.count(number2)
    if count1 < count2:
        return count1
    else:
        return count2
    return count1

但是因为想通过numpy学习更多神奇的东西,所以想知道这里有没有更好的解决方案。

【问题讨论】:

  • 这个“组合数量”是多少?在我看来更像是最小计数。
  • “1 和 2 的组合数量”是什么意思?不清楚你现有的代码是否正确。
  • 它的另一个任务不是其他问题,这里应该找到组合,而不是所有出现
  • 我编辑了问题以使其更清楚,请停止因为您不理解任务而投反对票。最好问一下,这样我可以改进文字...

标签: python numpy tuples


【解决方案1】:

您的if/else 可以更简洁地表达为min

In [707]: tup = (1,2,5,3,2,1,3,4,1)
In [708]: max(tup.count(1), tup.count(2))
Out[708]: 3
In [709]: min(tup.count(1),tup.count(2))
Out[709]: 2

numpy 不会对此进行改进。有一个bincount,它计算一个范围内的所有值。

In [710]: arr = np.array(tup)
In [711]: arr
Out[711]: array([1, 2, 5, 3, 2, 1, 3, 4, 1])
In [712]: np.bincount(arr)
Out[712]: array([0, 3, 2, 2, 1, 1], dtype=int32)

我们可以选择一个可以选择几个值并像以前一样得到它们的最小值:

In [716]: np.bincount(arr)[[1,2]]
Out[716]: array([3, 2], dtype=int32)
In [717]: min(np.bincount(arr)[[1,2]])
Out[717]: 2

请记住,np.array(tup) 需要时间;所以坚持使用列表操作通常更快。

另一种数组方法是使用广播的== 测试

In [532]: arr == [[1],[2]]
Out[532]: 
array([[ True, False, False, False, False,  True, False, False,  True],
       [False,  True, False, False,  True, False, False, False, False]], dtype=bool)
In [533]: _.sum(axis=1)
Out[533]: array([3, 2])

在布尔值上使用 sum 来计算它们。

还有Counter 类可以在一次调用中计算所有值:

In [534]: from collections import Counter
In [535]: Counter(tup)
Out[535]: Counter({1: 3, 2: 2, 3: 2, 4: 1, 5: 1})
In [536]: min(_[1],_[2])
Out[536]: 2

【讨论】:

  • 某些行中的_ 变量来自哪里?
  • 感谢min() 的出色解决方案,并且您表明numpy 不会让这里变得更容易。
猜你喜欢
  • 2017-12-23
  • 2015-09-22
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
相关资源
最近更新 更多