gpt4 book ai didi

python - Numpy:如何检查 ndarray 中是否存在元组

转载 作者:行者123 更新时间:2023-12-02 05:13:08 25 4
gpt4 key购买 nike

在处理 numpy 数组中的元组时,我发现了一个奇怪的行为。我想得到一个 bool 值表,告诉我数组 a 中的哪些元组也存在于数组 b 中。通常,我会使用 inin1d 中的任何一个。当 tuple(a[1]) == b[1,1] 产生 True 时,它们都不起作用。

我这样填写ab:

a = numpy.array([(0,0)(1,1)(2,2)], dtype=tuple)

b = numpy.zeros((3,3), dtype=tuple)
for i in range(0,3):
for j in range(0,3):
b[i,j] = (i,j)

谁能告诉我我的问题的解决方案,请告诉我为什么这不能按预期工作?

(顺便说一句,在这里使用 python2.7 和 numpy1.6.2。)

最佳答案

为什么这不起作用

简短的版本是 numpy 对 array.__contains__() 的实现似乎被破坏了。 python 中的 in 运算符在后台调用 __contains__()

意味着 a in b 等同于 b.__contains__(a)

我已经在 REPL 中加载了您的数组并尝试以下操作:

>>> b[:,0]
array([(0, 0), (1, 0), (2, 0)], dtype=object)
>>> (0,0) in b[:,0] # we expect it to be true
False
>>> (0,0) in list(b[:,0]) # this shouldn't be different from the above but it is
True
>>>

如何修复

我不明白你的列表理解是如何工作的,因为 a[x] 是一个元组而 b[:,:] 是一个二维矩阵,所以当然他们不平等。但我假设您打算使用 in 而不是 ==。如果我在这里错了,请纠正我,你的意思是我没有看到的不同内容。

第一步是将 b 从二维数组转换为一维数组,这样我们就可以线性筛选它并将其转换为列表,以避免 numpy 损坏的 array.__contains() 像这样:

bb = list(b.reshape(b.size))

或者,更好的是,将其设为 set,因为元组是不可变的,并且检查集合中的 in 是 O(1) 而不是列表的 O(n)行为

>>> bb = set(b.reshape(b.size))
>>> print bb
set([(0, 1), (1, 2), (0, 0), (2, 1), (1, 1), (2, 0), (2, 2), (1, 0), (0, 2)])
>>>

接下来我们简单地使用列表理解来导出 bool 表

>>> truth_table = [tuple(aa) in bb for aa in a]
>>> print truth_table
[True, True, True]
>>>

完整代码:

def contained(a,b):
bb = set(b.flatten())
return [tuple(aa) in bb for aa in a]

关于python - Numpy:如何检查 ndarray 中是否存在元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com