在二维numpy数组中查找值的索引

Wil*_*ill 0 python arrays numpy

我正在尝试从一个numpy数组中获取索引值,我尝试使用相交而不是徒劳。我只是想在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]])
Run Code Online (Sandbox Code Playgroud)

我们正在搜索说, values = numpy.array([97612, 97633, 97697, 97999, 97943, 97944])

所以我尝试:

numpy.where(a[:, 1] == values)
Run Code Online (Sandbox Code Playgroud)

而且我希望可以得到一堆值的索引,但是取而代之的是,我得到了一个空数组,它吐出了[(array([], dtype=int64),)]

如果我尝试这样做:

numpy.where(a[:, 1] == 97697)
Run Code Online (Sandbox Code Playgroud)

它给了我回报(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])
Run Code Online (Sandbox Code Playgroud)

我发现这numpy.in1d将为我提供一个正确的布尔值真值表,并具有一个应映射到原始数据的相同长度的一维数组。现在我唯一的问题是如何处理,例如删除或修改那些索引处的原始数组。我可以用一个循环努力地完成它,但是据我所知,numpy中有更好的方法。我已经找到了,用numpy掩盖的真值表应该是非常强大的。

fil*_*ppo 5

np.where一个参数等于np.nonzero。它为您提供条件(输入数组)为的索引True

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

a[:, 1] == values
False
Run Code Online (Sandbox Code Playgroud)

这样可以为您提供正确的结果:输入中没有索引为True

您应该np.isin改用

np.isin(a[:,1], values)
array([False, False,  True,  True, False, False, False, False,  True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

现在您可以np.where用来获取索引

np.where(np.isin(a[:,1], values))
(array([2, 3, 8]),)
Run Code Online (Sandbox Code Playgroud)

并使用它们来寻址原始数组

a[np.where(np.isin(a[:,1], values))]    
array([[    1, 97612,     1],
       [    1, 97697,     1],
       [    1, 97944,     1]])
Run Code Online (Sandbox Code Playgroud)

使用简单的相等性检查的初始解决方案确实可以通过以下方式工作broadcasting

np.where(a[:,1] == values[..., np.newaxis])[1]
array([2, 3, 8])
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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]])
Run Code Online (Sandbox Code Playgroud)

或者您想将匹配行的第三列乘以 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]])
Run Code Online (Sandbox Code Playgroud)

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

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]])
Run Code Online (Sandbox Code Playgroud)