【发布时间】:2025-12-18 18:55:02
【问题描述】:
我正在尝试从 numpy 数组中获取索引值,但我尝试使用 intersects 但无济于事。我只是想在 2 个数组中找到类似的值。一个是 2D,我正在选择一列,另一个是 1D,只是要搜索的值列表,因此实际上只有 2 个 1D 数组。
我们称这个数组为:
array([[ 1, 97553, 1],
[ 1, 97587, 1],
[ 1, 97612, 1],
[ 1, 97697, 1],
[ 1, 97826, 3],
[ 1, 97832, 1],
[ 1, 97839, 1],
[ 1, 97887, 1],
[ 1, 97944, 1],
[ 1, 97955, 2]])
我们正在搜索values = numpy.array([97612, 97633, 97697, 97999, 97943, 97944])
所以我试试:
numpy.where(a[:, 1] == values)
我希望有一堆值的索引,但我得到一个空数组,它吐出[(array([], dtype=int64),)]。
如果我尝试这个:
numpy.where(a[:, 1] == 97697)
它给了我(array([2]),),这是我所期望的。
我在这里缺少什么奇怪的数组?或者是否有更简单的方法来做到这一点?查找数组索引和匹配数组似乎根本不像我预期的那样工作。当我想通过索引或唯一值查找数组的并集或相交时,它似乎不起作用。任何帮助都会很棒。谢谢。
编辑: 根据沃伦斯的要求:
import numpy
a = numpy.array([[ 1, 97553, 1],
[ 1, 97587, 1],
[ 1, 97612, 1],
[ 1, 97697, 1],
[ 1, 97826, 3],
[ 1, 97832, 1],
[ 1, 97839, 1],
[ 1, 97887, 1],
[ 1, 97944, 1],
[ 1, 97955, 2]])
values = numpy.array([97612, 97633, 97697, 97999, 97943, 97944])
我发现numpy.in1d 会给我一个正确的布尔值真值表来进行操作,其中包含一个应该映射到原始数据的相同长度的一维数组。我现在唯一的问题是如何处理它,例如删除或修改这些索引处的原始数组。我可以用循环费力地做到这一点,但据我所知,numpy 有更好的方法。从我能找到的数据来看,作为掩码的真值表应该非常强大。
【问题讨论】:
-
“如果我尝试
numpy.intersect(a[:, 1], values),我应该会返回 97612、97697、97944。但我会得到一些毫无意义的东西。” 我假设你的意思是 @987654331 @;没有功能numpy.intersect。鉴于您在问题中显示的数据,np.intersect1d(a[:, 1], values)返回array([97612, 97697, 97944])。显示完全你做了什么,并显示你得到的意想不到的结果。 -
@bobrobbob 可能值得注意的是,如果
B中的值未包含在A中,则基于np.searchsorted的解决方案会给出错误且令人困惑的结果(它为您提供排序插入的索引) 所以这里需要进一步处理。 -
@bobrobbob OP 确实需要
B是A的子数组,这里不是这种情况 -
"...为了解决这个问题,我反复撕下它..." 呵呵,我知道那种感觉。 :) 我同意您可能向
intersect1d提供了“坏”数据。由于很明显intersect1d的行为不是问题的一部分,因此您可以从问题中删除有关它的 cmets。现在的方式只是混淆了问题。