Python3:向量化嵌套循环

Python3: vectorizing nested loops

我有这个功能:

def fun(x):   # x is a vector with size: (size_x*size_y) = n 
    c = 0
    f_vec = np.zeros((size_x*size_y))


    for i in range(size_x):
        for j in range(size_y):
             f_vec[c]=i*j*x[c]   
             c=c+1

    return f_vec

我这样做是因为向量 x 是(考虑 size_x=4 和 size_y=3)

 x[0]=x00    #c=0  i=0,j=0
 x[1]=x01    #c=1  i=0, j=1
 x[2]=x02    #c=2   i=0. j=size_y-1
 x[3]=x10    #c=3   i=1, j=0
 x[4]=x11
  ...
 x[n]=x32    #c=n   i=size_x-1, j= size_y-1

我可以避免嵌套循环并进行简单的矢量运算吗? 我想要像 f[c] = F[x[c]] *i *j

这样的东西

但是知道c值,求i和j就没那么简单了。 你知道方法吗?

谢谢。

您可以为此使用广播:

(
    x.reshape(size_x, size_y) *
    np.arange(size_x)[:, None] *
    np.arange(size_y)
).ravel()

或爱因斯坦求和形式

np.einsum(
    'ij,i,j->ij',
    x.reshape(size_x, size_y),
    np.arange(size_x),
    np.arange(size_y)
).ravel()

本质上,这和是一样的,但是我发现把i*j部分理解成2D ndarray np.outer(np.arange(x_size), np.arange(y_size)更容易理解,然后做广播:

(x.reshape(x_size, y_size) * np.outer(np.arange(x_size), np.arange(y_size)).ravel()

如果您对 x_sizey_size 的相同值重复执行此操作,则可以预先计算 i*j 部分。