Wil*_*ren 4 python arrays numpy scipy
我有多个numpy 2-d数组,我想比较行.我的函数的输出应该是一个numpy二维数组,表示三个输入数组的所有行.我希望能够检测到第一次出现行,每秒或第三个重复行应该在输出中标记为False.单个数组中不可能有重复的行.
如果有可能我想避免使用循环,因为它们会降低计算速度.
例:
array1 = array([[444, 427],
[444, 428],
[444, 429],
[444, 430],
[445, 421]], dtype=uint64)
array2 = array([[446, 427],
[446, 440],
[444, 429],
[444, 432],
[445, 421]], dtype=uint64)
array3 = array([[447, 427],
[446, 441],
[444, 429],
[444, 432],
[445, 421]], dtype=uint64)
# output
array([[True, True, True, True, True],
[ True, True, False, True, False],
[ True, True, False, False, False]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是一种快速矢量化方法:
def find_dupe_rows(*arrays):
A = np.vstack(arrays)
rtype = np.dtype((np.void, A.dtype.itemsize*A.shape[1]))
_, first_idx = np.unique(A.view(rtype), return_index=True)
out = np.zeros(A.shape[0], np.bool)
out[first_idx] = True
return out.reshape(len(arrays), -1)
Run Code Online (Sandbox Code Playgroud)
用法示例:
print(find_dupe_rows(array1, array2, array3))
# [[ True True True True True]
# [ True True False True False]
# [ True True False False False]]
Run Code Online (Sandbox Code Playgroud)
为了打破这一点:
堆叠三个子阵列以生成(15, 2)数组:
A = np.vstack((array1, array2, array3))
Run Code Online (Sandbox Code Playgroud)使用np.unique连同这一招,以有效地找到每个唯一行第一中出现的指标A:
rtype = np.dtype((np.void, A.dtype.itemsize * A.shape[1]))
_, first_idx = np.unique(A.view(rtype), return_index=True)
Run Code Online (Sandbox Code Playgroud)不是第一次出现的唯一行的每一行都可以视为重复:
out = np.zeros(A.shape[0], np.bool) # output is False by default
out[first_idx] = True # set first occurrences to True
Run Code Online (Sandbox Code Playgroud)最后,(narrays, nrows)根据您的示例输出重新整形此布尔向量:
return out.reshape(len(arrays), -1)
Run Code Online (Sandbox Code Playgroud)