V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Porphet
V2EX  ›  问与答

numpy 数组问题请大神解答

  •  
  •   Porphet · 2020-07-05 18:16:59 +08:00 · 902 次点击
    这是一个创建于 1601 天前的主题,其中的信息可能已经有所发展或是发生改变。
    a = [[1,2,3],
         [4,5,6],
         [7,8,9]]
    
    b = [1,2,3,4,5,6,7,8,9]
    
    c = [0,0,0,1,1,1,2,2,2]
    

    b 是 a 的排序数组,c 是根据排序的结果找到该数在数组 a (第 0 维) 的下标。
    举例:“2”在 a 数组中 dim=0 的下标是 0

    现在我有 a,想得到 c,注意是对所有数进行排序

    有什么好的解决办法,谢谢大家了

    jiejiss
        1
    jiejiss  
       2020-07-05 21:35:26 +08:00
    课后作业?建议先自己研究下
    volvo007
        2
    volvo007  
       2020-07-05 21:53:46 +08:00
    比较笨的办法:

    a = np.random.randint(0, 10, (5, 5)) # 随机生成一个 5x5 的整数矩阵

    b = [(j, i//a0.shape[1]) for i,j in enumerate(a0.flatten())] # 拍扁之后生成列表,每个元素为 (数值,行数)

    c = [i[1] for i in sorted(b0, key=lambda x: x[0]]

    就是感觉数据量大的话,这么写会很慢……
    renmu123
        3
    renmu123  
       2020-07-05 22:12:08 +08:00 via Android
    对 a 做个遍历将值和下标做成一个 dict,然后拍平后再对 b 做一个遍历处理,复杂度 O(n)
    Porphet
        4
    Porphet  
    OP
       2020-07-06 08:50:55 +08:00
    @jiejiss 看着确实像,其实不是,我想问有没有快速现成的方法,比如通过矩阵相乘。

    @volvo007 我现在要处理的元素数量是 150 * 50000 个

    @renmu123 有没有通过调用 numpy 或者 pytorch 函数的方法
    Porphet
        5
    Porphet  
    OP
       2020-07-06 08:56:24 +08:00
    @jiejiss @renmu123 @volvo007 谢谢大家已经解决了,昨天脑子比较混沌😄
    jiejiss
        6
    jiejiss  
       2020-07-06 08:57:49 +08:00
    @Porphet #4 拿 C 写出来,编译成动态链接库然后让 Python 用 ctypes 之类的去调用吧……

    涉及到排序还有查下标,那 Python 再怎么优化也一定是比较慢的
    Porphet
        7
    Porphet  
    OP
       2020-07-06 09:12:54 +08:00
    @jiejiss 这是极致的优化了,调用 numpy.argsort()得到排序后的下标,然后除一下 dim=1 的长度就可以了
    volvo007
        8
    volvo007  
       2020-07-06 12:55:45 +08:00
    @Porphet 哦,明白你意思了。昨天也想到了这个函数,但是一时没想起来后面怎么处理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:59 · PVG 04:59 · LAX 12:59 · JFK 15:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.