首页 > 解决方案 > numpy where output - 我如何使用该值?

问题描述

我有一个列表some_list = [[1, 2], [3, 4], [3, 6]] ,我想找到一些表达式被评估为真的索引:

np.where([3 in sublist for sublist in some_list])

输出是(array([1, 2], dtype=int64),)

由于我想删除3内部的子列表,我怎样才能访问这样的数组(以一种优雅的方式)?有了数组,我可以做到[some_list.pop(index) for index in array]

编辑:似乎它可以使用for index in np.where([3 in sublist for sublist in some_list])[0]

标签: pythonpython-3.xnumpytuples

解决方案


where只返回一个数组元组,该数组索引元素值为 True 的位置。

In [447]: some_list = [[1, 2], [3, 4], [3, 6]]                                  

您的列表测试:

In [448]: [3 in sublist for sublist in some_list]                               
Out[448]: [False, True, True]
In [449]: np.where([3 in sublist for sublist in some_list])                     
Out[449]: (array([1, 2]),)

对于一维列表 [448],这是一个单元素元组。我们可以通过简单的索引提取该数组:

In [450]: _[0]                                                                  
Out[450]: array([1, 2])

并使用它来选择子列表some_list

In [451]: [some_list[i] for i in _]                                             
Out[451]: [[3, 4], [3, 6]]

如果列表是一个数组:

In [455]: arr = np.array(some_list)                                             
In [456]: arr                                                                   
Out[456]: 
array([[1, 2],
       [3, 4],
       [3, 6]])

我们可以对 3 进行相同的搜索:

In [457]: arr==3                                                                
Out[457]: 
array([[False, False],
       [ True, False],
       [ True, False]])
In [458]: (arr==3).any(axis=1)                                                  
Out[458]: array([False,  True,  True])
In [459]: np.where(_)                                                           
Out[459]: (array([1, 2]),)

该 [459] 元组可用于直接索引 [458] 数组。在这种情况下,它也可以用于索引以下行arr

In [460]: arr[_]                                                                
Out[460]: 
array([[3, 4],
       [3, 6]])

在这里,从 1d [458] 派生的元组有效,但如果不能,我们可以(再次)使用索引提取数组,并使用它:

In [461]: np.where((arr==3).any(axis=1))[0]                                     
Out[461]: array([1, 2])
In [462]: arr[_, :]                                                             
Out[462]: 
array([[3, 4],
       [3, 6]])

===

这样做的纯列表方式:

In [476]: [i for i,sublist in enumerate(some_list) if 3 in sublist]                     
Out[476]: [1, 2]

它可能会更快,因为np.where将列表输入转换为数组,这需要时间。


推荐阅读