在2D numpy数组中查找值的索引

2024-09-29 23:15:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着从numpy数组中获取索引值,我试着使用intersects而不是无效的。我只是想在两个数组中找到相似的值。一个是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]),),这是我所期望的。

我这里少了什么奇怪的数组?或者有更简单的方法来做这个吗?查找数组索引和匹配数组似乎根本没有我所期望的那样工作。当我想通过indice或unique值找到数组的并集或交集时,它似乎不起作用。任何帮助都是很好的。谢谢。

编辑: 根据沃伦的要求:

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将为操作提供一个正确的布尔值真值表,其1d数组的长度应与原始数据相同。我现在唯一的问题是如何处理这个问题,例如删除或修改这些索引处的原始数组。我可以用一个循环费力地完成它,但据我所知,在numpy有更好的方法。作为面具的真相表应该是非常强大的,从我所能找到的努比。


Tags: 方法importnumpy编辑列表数组wherearray
2条回答

带有单个参数的^{}等价于^{}。它提供了条件input数组是True的索引。

在您的示例中,您正在检查a[:,1]values之间的元素相等性

a[:, 1] == values
False

所以它给出了正确的结果:输入中没有索引是True

您应该改用^{}

np.isin(a[:,1], values)
array([False, False,  True,  True, False, False, False, False,  True, False], dtype=bool)

现在可以使用^{}获取索引

np.where(np.isin(a[:,1], values))
(array([2, 3, 8]),)

并使用这些来处理原始数组

a[np.where(np.isin(a[:,1], values))]    
array([[    1, 97612,     1],
       [    1, 97697,     1],
       [    1, 97944,     1]])

通过简单的等式检查,您的初始解决方案确实可以使用正确的^{}

np.where(a[:,1] == values[..., np.newaxis])[1]
array([2, 3, 8])

编辑如果您在使用上述结果索引和操作数组时遇到问题,这里有几个简单的示例

现在您应该有两种方法来访问原始数组中的匹配元素,二进制掩码或np.where中的索引。

mask = np.isin(a[:,1], values)  # np.in1d if np.isin is not available
idx = np.where(mask)

假设要将所有匹配行设置为零

a[mask] = 0   # or a[idx] = 0
array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    0,     0,     0],
       [    0,     0,     0],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    0,     0,     0],
       [    1, 97955,     2]])

或者将匹配行的第三列乘以100

a[mask, 2] *= 100
array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    1, 97612,   100],
       [    1, 97697,   100],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    1, 97944,   100],
       [    1, 97955,     2]])

或者您想删除匹配的行(这里使用索引比掩码更方便)

np.delete(a, idx, axis=0)
array([[    1, 97553,     1],
       [    1, 97587,     1],
       [    1, 97826,     3],
       [    1, 97832,     1],
       [    1, 97839,     1],
       [    1, 97887,     1],
       [    1, 97955,     2]])

相关问题 更多 >

    热门问题