numpyThonic数组比较的方法?

时间:2019-07-14 20:32:39

标签: python numpy

考虑以下代码:

>>> initial_array = np.vstack(([0, 1, 2, 3, 4, 11, 6, 7, 8, 9], [1, 11, 12, 13, 14, 15, 16, 17, 18, 19])).T
>>> initial_array
array([[ 0,  1],
       [ 1, 11],
       [ 2, 12],
       [ 3, 13],
       [ 4, 14],
       [11, 15],
       [ 6, 16],
       [ 7, 17],
       [ 8, 18],
       [ 9, 19]])

>>> test = np.vstack(([0, 1, 2, 67, 4, 5], [10, 11, 67, 13, 14, 67])).T
>>> test
array([[ 0, 10],
       [ 1, 11],
       [ 2, 67],
       [67, 13],
       [ 4, 14],
       [ 5, 67]])

是否有一种以数字方式比较initial_array w.r.t test的每一行以获取掩码的方法?

[False, True, False, False, True, False, False, False, False, False]

这个想法是要知道initial_array中包含test的哪些行(对)。

谢谢。

3 个答案:

答案 0 :(得分:0)

这是一种实现方法:

res = []
# Go through all your array pairs
for ar in initial_array:
    found = False

    # Compare against all other pairs in test 
    for tes in test:
        # Make sure arrays are exactly the same
        if (ar==tes).all():
            res.append(True)
            found = True
            break

    # False if you didn't find a match
    if found:
        continue
    res.append(False)

print(res)
[False, True, False, False, True, False, False, False, False, False]

答案 1 :(得分:0)

您可以尝试利用unique()函数。

  1. 合并测试和initial_array
  2. 计算唯一行,反向映射将唯一行形成到原始数组,并且给定唯一行首次出现在合并数组中。 函数np.unique可以完成所有这些工作。
  3. 通过检查是否在第一个len(test)行之后首次出现才检查哪个唯一值仅在initial_array中出现。
  4. 使用逆映射为最后len(inital_array)行重构布尔数组

代码:

import numpy as np

initial_array = np.vstack(([0, 1, 2, 3, 4, 11, 6, 7, 8, 9], [1, 11, 12, 13, 14, 15, 16, 17, 18, 19])).T
test = np.vstack(([0, 1, 2, 67, 4, 5], [10, 11, 67, 13, 14, 67])).T

merged = np.vstack((test, initial_array))

_, index, inverse = np.unique(merged, return_index=True, return_inverse=True, axis=0)

mask = index < len(test)

result = mask[inverse[len(test):]]

print(result)

稍微简单一点的解决方案利用合并数组上的unique()为每个唯一行分配一个唯一整数。接下来,使用numpy中的一维set操作(函数in1d())进行比较。

merged = np.vstack((test, initial_array))
_, uniqinv = np.unique(merged, return_inverse=True, axis=0)
result = np.in1d(uniqinv[len(test):], uniqinv[:len(test)])
print(result)

此解决方案的缺点是做两种(unique()和in1d())。

答案 2 :(得分:0)

您可以使用广播在两个数组中的所有对之间进行比较,然后使用np.anynp.all将结果组合为您想要的一维数组结果:

result = np.any(np.all(initial_array[:,None] == test[None,:], axis=2), axis=1)