2024-05-15 03:49:39 发布
网友
我正在做以下事情。在
import numpy as np import pylab ..... x = np.zeros([250,200]) for tup in tups: x[tup[1],tup[0]] = x[tup[1],tup[0]] + 1 pylab.imshow(x)
在哪里
和xi,yi是整数
xi
yi
对于点数较少的tup来说,这很好。对于大量的点~10^6,这需要几个小时。在
tup
你能想出一个更快的办法吗?在
使用numpy,您可以将成对的索引转换为一个平面索引并对其进行bincount:
import numpy as np import random rows, cols = 250, 200 n = 1000 tups = [(random.randint(0, rows-1), random.randint(0, cols-1)) for _ in range(n)] x = np.zeros((rows, cols)) for tup in tups: x[tup[0],tup[1]] += 1 flat_idx = np.ravel_multi_index(zip(*tups), (rows, cols)) y = np.bincount(flat_idx, minlength=rows*cols).reshape(rows, cols) np.testing.assert_equal(x, y)
它将比任何循环解决方案都快得多。在
我很容易看到一个小小的改进,而不是下一个:
for tup in tups: x[tup[1],tup[0]] = x[tup[1],tup[0]] + 1
试着去做
因为这会覆盖相同的内存地址,而不是创建一个新的内存点来放入“旧值+1”(注意:在这种情况下,这可能只会导致边际加速,但是如果你用同样的方法a+=B而不是C=a+B,在a和B分别是大约1gb的numpy ndarray的情况下,这实际上是一个巨大的加速)
你为什么读元组?你不应该首先把它作为一个numpy数组读入,而不是作为元组列表读入,然后改为numpy数组吗?你在哪里创建元组的大列表?如果可以避免这种情况,那么最好是避免元组列表,而不是创建元组列表,然后再交换到numpy解决方案?在
编辑:所以我只想告诉你这个加速,你可以通过+=,同时问为什么你有一个大的元组列表,但这太长了,不能把这两个东西都放在评论中
另一个问题:我假设元组可以有多个重复吗?像
tups = [(1,0), (2,4), (1,0), (1,2), ..., (999, 999), (992, 999)]
所以在你的最终结果中,除了0和1之外还会存在其他值?或者你得到的数组中只有一和零?在
使用numpy,您可以将成对的索引转换为一个平面索引并对其进行bincount:
它将比任何循环解决方案都快得多。在
我很容易看到一个小小的改进,而不是下一个:
试着去做
^{pr2}$因为这会覆盖相同的内存地址,而不是创建一个新的内存点来放入“旧值+1”(注意:在这种情况下,这可能只会导致边际加速,但是如果你用同样的方法a+=B而不是C=a+B,在a和B分别是大约1gb的numpy ndarray的情况下,这实际上是一个巨大的加速)
你为什么读元组?你不应该首先把它作为一个numpy数组读入,而不是作为元组列表读入,然后改为numpy数组吗?你在哪里创建元组的大列表?如果可以避免这种情况,那么最好是避免元组列表,而不是创建元组列表,然后再交换到numpy解决方案?在
编辑:所以我只想告诉你这个加速,你可以通过+=,同时问为什么你有一个大的元组列表,但这太长了,不能把这两个东西都放在评论中
另一个问题:我假设元组可以有多个重复吗?像
所以在你的最终结果中,除了0和1之外还会存在其他值?或者你得到的数组中只有一和零?在
相关问题 更多 >
编程相关推荐