许多函数都喜欢in1d
和setdiff1d
专为一维数组而设计。将这些方法应用于 N 维数组的一种解决方法是numpy
将每一行(更高维的)视为一个值。
我发现这样做的一种方法是在这个答案Get intersecting rows across two 2D numpy arrays by Joe Kington。
以下代码取自此答案。Joe Kington 面临的任务是A
在B
尝试使用in1d
.
import numpy as np
A = np.array([[1,4],[2,5],[3,6]])
B = np.array([[1,4],[3,6],[7,8]])
nrows, ncols = A.shape
dtype={'names':['f{}'.format(i) for i in range(ncols)],
'formats':ncols * [A.dtype]}
C = np.intersect1d(A.view(dtype), B.view(dtype))
# This last bit is optional if you're okay with "C" being a structured array...
C = C.view(A.dtype).reshape(-1, ncols)
我希望你能帮助我解决以下三个问题中的任何一个。首先,我不了解这种方法背后的机制。你能试着向我解释一下吗?
其次,还有其他方法可以让 numpy 将子数组视为一个对象吗?
还有一个悬而未决的问题:Joe 的方法有什么缺点吗?我的意思是将行视为一个值是否会导致一些问题?对不起,这个问题相当广泛。