首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在numpy中使用`np.choose`或`np.take`或类似工具向量化?

如何在numpy中使用`np.choose`或`np.take`或类似工具向量化?
EN

Stack Overflow用户
提问于 2021-05-27 19:30:50
回答 2查看 44关注 0票数 1

我想对下面的do_permutation函数进行矢量化。我想删除python中的循环,改为使用numpy方法。

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

def do_permutation(indices):
    perm = np.zeros(len(indices), dtype='int32')
    for i, o in enumerate(indices):
        perm[o] = i
    return perm

assert list(do_permutation([3, 2, 4, 1, 0])) == [4, 3, 1, 0, 2]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-27 19:46:00

一般的解决方案是

代码语言:javascript
复制
do_perm = np.argsort

但是,此解决方案是O(N log N)。对于足够长的索引,实际上是从0到N的排列,O(N)解决方案是值得的。在这种情况下,使用直接排序:

代码语言:javascript
复制
def do_perm(indices):
    perm = np.empty_like(indices)
    perm[indices] = np.arange(len(indices))
    return perm

最后一行也可以写成

代码语言:javascript
复制
np.put(perm, indices, np.arange(indices.size))

使用np.put可以透明地处理解开的indices

票数 1
EN

Stack Overflow用户

发布于 2021-05-27 19:39:07

您可以将其赋值给使用给定索引编制索引的数组的片段。

代码语言:javascript
复制
def do_permutation(indices):
    N = len(indices);
    perm = np.zeros(N, dtype='int32')
    perm[indices] = np.arange(N)
    return perm
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67721253

复制
相关文章

相似问题

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