python - 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]
解决方案
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
将列表输入转换为数组,这需要时间。
推荐阅读
- java - 遍历地图列表(列表
- python - 当 django admin 中的某个字段更改时执行操作
- ios - Xcode 本地化 Main.strings 文件具有多个具有相同上下文的字符串。全部链接到一个主字符串?
- c - 读取文本文件并显示除所有空白行和注释之外的每一行的 C 程序
- javascript - 如何使用从 REST API 返回的 PDF 内容创建 PDF 文档
- android - 如何使用 AirTest 对触摸事件使用绝对位置(方向无关紧要)
- python - Python在32个字符后截断字符串?
- chart.js - chartjs chart.update() 函数不在前台渲染线条
- php - 无法读取 if else 条件
- python - 从 Pandas 数据框中的值中删除反斜杠