首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从带numpy的已筛选排序数组返回索引

从带numpy的已筛选排序数组返回索引
EN

Stack Overflow用户
提问于 2015-09-30 18:31:18
回答 4查看 1.7K关注 0票数 7

在python/numpy中执行以下操作的最简单的方法是什么?

  • 从随机数组x开始
  • 滤除元素x < .5
  • 按大小对剩余值进行排序
  • 对应于这些值的(原始) x的返回索引
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-09-30 18:32:49

一种解决办法是:

  • 创建已排序的索引数组(argsort)
  • 为低于阈值的排序x创建掩码
  • 将掩码应用于排序索引数组

示例:

代码语言:javascript
复制
import numpy as np

# x = np.random.rand(4)
x = np.array([0.96924269, 0.30592608, 0.03338015, 0.64815553])
solution = np.array([2, 1])

sorted_idx = np.argsort(x)
idx_mask = (x[sorted_idx] < 0.5)
sorted_filtered_idx = sorted_idx[idx_mask]

assert np.all(sorted_filtered_idx == solution)
票数 3
EN

Stack Overflow用户

发布于 2015-09-30 19:02:04

在这里,找到x < 0.5x.argsort()的面具似乎是强制性的。有了这两个之后,就可以使用排序索引对掩码数组进行排序,并在排序索引上使用这个掩码返回与满足掩蔽条件的排序索引对应的索引。因此,您需要再添加一行代码,就像-

代码语言:javascript
复制
mask = x < 0.5
sort_idx = x.argsort()
out = sort_idx[mask[sort_idx]]

一步一步的跑-

代码语言:javascript
复制
In [56]: x
Out[56]: array([ 0.8974009 ,  0.30127187,  0.71187137,  0.04041124])

In [57]: mask
Out[57]: array([False,  True, False,  True], dtype=bool)

In [58]: sort_idx
Out[58]: array([3, 1, 2, 0])

In [59]: mask[sort_idx]
Out[59]: array([ True,  True, False, False], dtype=bool)

In [60]: sort_idx[mask[sort_idx]]
Out[60]: array([3, 1])
票数 11
EN

Stack Overflow用户

发布于 2015-09-30 19:17:22

屏蔽阵列简洁(但可能不是特别有效)

代码语言:javascript
复制
x = np.random.rand(4);

inverse_mask = x < 0.5
m_x = np.ma.array(x, mask=np.logical_not(inverse_mask))
sorted_indeces = m_x.argsort(fill_value=1)
filtered_sorted_indeces = sorted_indeces[:np.sum(inverse_mask)]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32873263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档