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_size
和 y_size
的相同值重复执行此操作,则可以预先计算 i*j
部分。
我有这个功能:
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_size
和 y_size
的相同值重复执行此操作,则可以预先计算 i*j
部分。