考虑以下代码:
>>> 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
的哪些行(对)。
谢谢。
答案 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()函数。
代码:
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.any
和np.all
将结果组合为您想要的一维数组结果:
result = np.any(np.all(initial_array[:,None] == test[None,:], axis=2), axis=1)