numpy 数组问题请大神解答

2020-07-05 18:16:59 +08:00
 Porphet
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,注意是对所有数进行排序

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

833 次点击
所在节点    问与答
8 条回复
jiejiss
2020-07-05 21:35:26 +08:00
课后作业?建议先自己研究下
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
2020-07-05 22:12:08 +08:00
对 a 做个遍历将值和下标做成一个 dict,然后拍平后再对 b 做一个遍历处理,复杂度 O(n)
Porphet
2020-07-06 08:50:55 +08:00
@jiejiss 看着确实像,其实不是,我想问有没有快速现成的方法,比如通过矩阵相乘。

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

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

涉及到排序还有查下标,那 Python 再怎么优化也一定是比较慢的
Porphet
2020-07-06 09:12:54 +08:00
@jiejiss 这是极致的优化了,调用 numpy.argsort()得到排序后的下标,然后除一下 dim=1 的长度就可以了
volvo007
2020-07-06 12:55:45 +08:00
@Porphet 哦,明白你意思了。昨天也想到了这个函数,但是一时没想起来后面怎么处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/687347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX