在嵌套循环中矢量化操作:Python

时间:2015-06-29 10:37:45

标签: python numpy vectorization nested-loops compiler-optimization

我有2D numpy数组,我需要两个嵌套循环来迭代它的每个元素。我想在嵌套循环上进行一些矢量化,但我一直都会收到错误,

j= np.arange (0,x.shape [1])
IndexError: tuple index out of range

这些是原始的嵌套循环:

for k in range(A.shape[0]):
        for j in range(A.shape[1]):
            A[k,j] = method1(x[k],x[j],a,c0,c1)

这就是我尝试根据这个答案https://codereview.stackexchange.com/questions/17702/python-numpy-running-15x-slower-than-matlab-am-i-using-numpy-effeciently

进行矢量化的方法
j= np.arange (0, A.shape [1])
    for k in range(A.shape[0]):

            A[k,j] = method1(x[k],x[j],a,c0,c1)

我试图更改np.arange中的索引,但它不起作用。

任何人都可以告诉我如何解决这个问题?

感谢。

编辑:通过@ajcr评论,我的错误是在这一行,j = np.arange(0,x.shape [1]),我应该使用2D数组“A”的列数作为j = np.arange(0,A.shape [1]),但我错误地使用了1D数组x,因此出错了。它现在工作得很好。

1 个答案:

答案 0 :(得分:2)

由于您不提供此功能,因此很难给您答案。如果可以对您的计算进行矢量化,那么这就是可行的方法。否则,您可以使用np.vectorize

import numpy as np

def my_fun(x,y,a,b):
    if x > y:
        return a*x**2 + y
    else:
        return b*x**2 + a*y

vec_fun = np.vectorize(my_fun)
x = np.random.rand(100000)
y = np.random.rand(100000)

%%timeit
for xx,yy in zip(x,y):
    my_fun(xx,yy,1,2)

10个循环,最佳3:每循环138 ms

%%timeit
    vec_fun(x,y,1,2)

10个循环,最佳3:每循环65.4毫秒

如果您只是循环输入参数列表,则可以使用multiprocessing.Pool来利用所有核心。

编辑:正如BlackCat所说,np.vectorize函数可能无法加快速度。如果是这种情况,我能想到的唯一解决方案是使用所有内核或切换到Cython。

相关问题