我需要得到主numpy 2d数组A的交叉行的索引,另外3个数组B,C和D,并返回另一个数组E和索引 例如:
A = array([[1,1],
[2,3],
[2,4],
[3,4],
[3,5],
[3,6],
[4,5],
[5,6]])
B = array([[2,3],
[4,3],
[3,5]])
C = array([[3,4],
[3,5],
[5,6]])
D = array([[4,2],
[5,4],
[6,3]])
RESULT ARRAY:
[[1, 3, -2],
[-3, 4, -6],
[4, 7, -5]]
请注意,当列反转时,indice的结果必须假设( - )
例如,交叉A和B:
A = array([[1,1],
[2,3],
[2,4],
[3,4],
[3,5],
[3,6],
[4,5],
[5,6]])
B = array([[2,3],
[4,3],
[3,5]])
RESULT ARRAY:
[1, -3, 4]
将行B:[4,3]与A:[3,4]相交,返回结果-3,因为相交的行是反转的
谢谢!
答案 0 :(得分:2)
如果将数组转换为元组的记录数组,则可以使用in1d
的魔法来执行此操作。
def get_indices(a, b):
# Convert to arrays if needed
a = np.asarray(a)
b = np.asarray(b)
dtype = 'int, int'
# Get the indices
forward = np.in1d(a.view(dtype), b.view(dtype))
backward = np.in1d(a[:, ::-1].copy().view(dtype), b.view(dtype))
# Compute formatting as requested
sign = forward.astype(int) - backward.astype(int)
value = forward | backward
indices = np.where(value)[0]
return indices * sign[indices]
使用此功能,您可以为每个数组调用它以获得结果:
>>> np.hstack([get_indices(A, b)[:, None] for b in [B, C, D]])
array([[ 1, 3, -2],
[-3, 4, -5],
[ 4, 7, -6]], dtype=int64)
答案 1 :(得分:0)
将A的所有元素放入字典中,其中键是行(作为元组),值是行的索引。然后迭代B,C,D行,使用字典查找A的索引。
A = [[1,1],
[2,3],
[2,4],
[3,4],
[3,5],
[3,6],
[4,5],
[5,6]]
B = [[2,3],
[4,3],
[3,5]]
C = [[3,4],
[3,5],
[5,6]]
D = [[4,2],
[5,4],
[6,3]]
A_dict = {tuple(pair): i for i, pair in enumerate(A)}
A_dict.update({(pair[1], pair[0]): -i for i, pair in enumerate(A)})
result_array = []
for arr in [B, C, D]:
result_array.append([A_dict[tuple(pair)] for pair in arr])
print result_array
答案 2 :(得分:0)
我的建议......
def search(Array,Main):
lst = []
for row in Array:
mtc = np.where((Main == row).all(axis=1))[0]
if len(mtc) == 0:
mtc = np.where((np.flip(A,1) == row).all(axis=1))[0] * -1
lst.append(mtc)
return np.array(lst)
arrays = [search(x,A) for x in [B,C,D]]
print np.hstack(arrays)
为您提供阵列
[[ 1 3 -2]
[-3 4 -6]
[ 4 7 -5]]
答案 3 :(得分:0)
另一个想法:
请注意,我使用列表而不是数组,因此使用.tolist()
def intersect(A, Blist):
A, Blist = A.tolist(), [B.tolist() for B in Blist]
return np.transpose( [[A.index(l) if l in A else -A.index([l[1], l[0]]) for l in L] for L in Blist] )
这会产生
array([[ 1, 3, -2],
[-3, 4, -6],
[ 4, 7, -5]])
代表
intersect(A, [B, C, D])