如何使用掩码将元素和索引放入原始数组

How to get elements and indices into original array with mask

我正在尝试从元素匹配的两个数组中获取元素和索引。我想我想多了,但我已经尝试了 where 函数和交集,但无法让它工作。我的实际数组要长得多,但这里有两个简单的数组来演示我想要什么:

import numpy as np

arr1 = np.array([0.00, 0.016, 0.033, 0.050, 0.067])
arr2 = np.array([0.016, 0.033, 0.050, 0.067, 0.083])

ind = np.intersect1d(np.where(arr1 >= 0.01), np.where(arr2 >= 0.01))

打印 ind 显示 array([1, 2, 3, 4])。从技术上讲,我想要 arr1 中的元素 1, 2, 3, 4arr2 中的元素 0, 1, 2, 3,这给出了在两个数组中匹配的元素 0.016, 0.033, 0.050, 0.067

np.wherearr1 >= 0.01 之类的布尔掩码转换为索引。可以直接用面具select,但不能反转。您需要反转索引,因为您想要与原始数组相交,而不是 selection。确保设置 return_indices=True 以从 intersect1d:

获取索引
index1 = np.nonzero(arr1 >= 0.01)
index2 = np.nonzero(arr2 >= 0.01)
selection1 = arr1[index1]
selection2 = arr2[index1]

elements, ind1, ind2 = np.intersect1d(selection1, selection2, return_indices=True)

index1 = index1[ind1]
index2 = index2[ind2]

当您直接从交叉点得到 elements 时,索引 ind1ind2 引用掩蔽的 select 离子。由于 index1selection1 中每个元素的原始索引,index1[ind1]ind1 转换回 arr1 参考系。

你原来的表达其实毫无意义。您正在与满足您条件的每个数组中的索引相交。这与这些索引的值无关(根本不必匹配)。看似正确的结果纯属巧合,基于偶然的数组构造。