我有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)
进行矢量化的方法
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,因此出错了。它现在工作得很好。答案 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。