Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用于numpy/scipy的快速索引点积_Python_Numpy_Scipy_Cython_Blas - Fatal编程技术网

Python 用于numpy/scipy的快速索引点积

Python 用于numpy/scipy的快速索引点积,python,numpy,scipy,cython,blas,Python,Numpy,Scipy,Cython,Blas,我用numpy做线性代数。我想做快速子集索引点和其他线性运算 在处理大型矩阵时,像[:,subset].dotx[subset]这样的切片解决方案可能比在完整矩阵上进行乘法要长 A = np.random.randn(1000,10000) x = np.random.randn(10000,1) subset = np.sort(np.random.randint(0,10000,500)) 计时显示,当列位于一个块中时,子索引可以更快 %timeit A.dot(x) 100 loops,

我用numpy做线性代数。我想做快速子集索引点和其他线性运算

在处理大型矩阵时,像[:,subset].dotx[subset]这样的切片解决方案可能比在完整矩阵上进行乘法要长

A = np.random.randn(1000,10000)
x = np.random.randn(10000,1)
subset = np.sort(np.random.randint(0,10000,500))
计时显示,当列位于一个块中时,子索引可以更快

%timeit A.dot(x)
100 loops, best of 3: 4.19 ms per loop

%timeit A[:,subset].dot(x[subset])
100 loops, best of 3: 7.36 ms per loop

%timeit A[:,:500].dot(x[:500])
1000 loops, best of 3: 1.75 ms per loop
但加速度并不是我期望的20倍

有没有人知道一个库/模块的想法,它允许通过numpy或scipy进行此类快速操作

现在,我正在使用cython通过cblas库编写一个快速列索引点积。但对于更复杂的伪逆运算,或子索引最小二乘法求解,我不是舒尔,无法实现良好的加速

谢谢

嗯,这样更快

%timeit A.dot(x)
#4.67 ms

%%timeit
y = numpy.zeros_like(x)
y[subset]=x[subset]
d = A.dot(y)
#4.77ms

%timeit c = A[:,subset].dot(x[subset])
#7.21ms
你得到了alld ravelc==0==True

请注意,速度取决于输入。对于subset=array[1,2,3],我们的解的时间几乎相同,而最后一个解的时间是46微秒


基本上,如果子集的大小不比x的大小小得多,这会更快。为什么你期望20倍的加速?天真地说,计算10000列的结果应该比计算500列快20倍。是的,但我离我期望的20倍的加速还远。你不能期望20倍的加速,因为您正在处理非连续的数据,这可能会导致计算速度变慢。是的,您是对的,但在处理“F”连续数组时,您可以达到很好的速度,例如使用cblas库的cython接口。实际上,我在想,是否有一个模块能够以一种易于使用的方式实现类似或更好的加速,并且可以实现更复杂的操作。对于随机索引,顺序是F还是C都无关紧要。看看[:,子集]的计时。这比在500列上做点要大得多。是的,这实际上是我的问题。那么,有没有一种方法可以在不进行切片/索引的情况下进行这种计算,从而避免分配新数组的额外成本呢?或者,如何直接处理文件中包含的数据?