【发布时间】:2018-12-17 12:27:34
【问题描述】:
我有两个 2D numpy 数组,例如:
A = numpy.array([[1, 2, 4, 8], [16, 32, 32, 8], [64, 32, 16, 8]])
和
B = numpy.array([[1, 2], [32, 32]])
我想拥有来自A 的所有行,我可以在其中找到来自B 的任何行的所有元素。如果B 的一行中有 2 个相同元素,则来自A 的行也必须至少包含 2 个。在我的例子中,我想实现这个:
A_filtered = [[1, 2, 4, 8], [16, 32, 32, 8]]
我可以控制值表示,所以我选择了二进制表示只有一个位置的数字 1(例如:0b00000001 和 0b00000010 等...)这样我可以轻松检查是否所有通过使用np.logical_or.reduce() 函数,值的类型在行中,但我无法检查A 行中相同元素的数量是否更大或相等。我真的希望我可以避免简单的for 循环和数组的深层副本,因为性能对我来说是一个非常重要的方面。
如何在 numpy 中以有效的方式做到这一点?
更新:
here 的解决方案可能有效,但我认为性能对我来说是一个大问题,A 可以非常大(>300000 行),B 可以适中(>30):
[set(row).issuperset(hand) for row in A.tolist() for hand in B.tolist()]
更新 2:
set() 解决方案不起作用,因为set() 删除了所有重复值。
【问题讨论】:
-
B中相同元素的2个或
B的任意行? -
“至少 2”重要吗?如果 A 和 B 中的行需要 B 中的每个标记的数量相等,我想我知道一个优雅的解决方案。
-
任意行的同一元素的 2 个。 “至少2”非常重要。在
A中,接受[32, 32, 32,8]这一行 -
我不认为集合完全符合你的描述,因为单一和多次出现之间的区别会丢失。
标签: python arrays numpy vectorization