将三个for循环写入一行(python)

将三个for循环写入一行(python),python,nested-loops,Python,Nested Loops,我有以下程序 import numpy as np X = np.asarray([ [2,3,4,5,1,1,1], [1,2,3,4,1,1,1], [3,3,3,3,1,1,1]]) Nrows=X.shape[0] Ncols1=X.shape[1] cols=np.asarray( [[1,3]]) Ncols2=cols.shape[1] Y = np.ndarray(shape=(Nrows,Ncols2)) for i in range(Nrows):

我有以下程序

import numpy as np

X = np.asarray([ [2,3,4,5,1,1,1],
  [1,2,3,4,1,1,1],
  [3,3,3,3,1,1,1]])

Nrows=X.shape[0]
Ncols1=X.shape[1]

cols=np.asarray( [[1,3]])
Ncols2=cols.shape[1]

Y = np.ndarray(shape=(Nrows,Ncols2))

for i in range(Nrows):
    for j in range(Ncols2):
        sum=0
        for k in range(Ncols1):
            sum=sum+np.exp(-(X[i,k]-X[i,cols[0,j])**2)
        Y[i,j]=sum
我想把这三个回路缩成一行。这里的动机部分是为了加速,部分是为了练习python技能

所以我可以把它写成两个循环:

for i in range(Nrows):
    for j in range(Ncols1):
        Y[i,j]=np.sum(np.exp(-(X[i,]-X[i,cols[0,j]])**2))
for i in range(Nrows):
   Y[i,]=map(lambda j: np.sum(np.exp(-(X[i,]-X[i,cols[0,j]])**2)),range(Ncols2))
我可以把它写成一个循环:

for i in range(Nrows):
    for j in range(Ncols1):
        Y[i,j]=np.sum(np.exp(-(X[i,]-X[i,cols[0,j]])**2))
for i in range(Nrows):
   Y[i,]=map(lambda j: np.sum(np.exp(-(X[i,]-X[i,cols[0,j]])**2)),range(Ncols2))
但我不知道如何把它变成一行。我的本能是尝试

Y[:,]=map(lambda j: np.sum(np.exp(-(X[:,]-X[:,cols[0,j]])**2)),range(Ncols2))
但由于“ValueError:操作数无法与形状(3,7)(3,)一起广播”而失败

任何帮助都将不胜感激

-尼克

这就使用了它,几乎只是你的for循环在一条线上

[np.sum(np.exp(-(X[i,]-X[i, cols[0,j]])**2)) for i in range(Nrows) for j in range(Ncols2)]
这与此有点一致:

Y=[]
for i in range(Nrows):
  for j in range(Ncols2):
    Y.append(#your big formula that uses i and j as arguments)
由于它是一个列表,您必须从中创建一个数组并根据自己的喜好对其进行重塑,因此在列表comp之前是
np.asarray
,之后是
.restrape

从来没有玩过numpy太多…我喜欢它

这就使用了它,几乎只是你的for循环在一条线上

[np.sum(np.exp(-(X[i,]-X[i, cols[0,j]])**2)) for i in range(Nrows) for j in range(Ncols2)]
这与此有点一致:

Y=[]
for i in range(Nrows):
  for j in range(Ncols2):
    Y.append(#your big formula that uses i and j as arguments)
由于它是一个列表,您必须从中创建一个数组并根据自己的喜好对其进行重塑,因此在列表comp之前是
np.asarray
,之后是
.restrape


从来没有玩过numpy太多…我喜欢它

我不确定把for循环压缩成一行是否更有效。但我相信你最终会陷入一个非常复杂的混乱。我同意@leaf所说的不要写你无法理解的代码。这种微优化不会有多大帮助。不好的做法一般来说,更少的代码并不一定意味着更快的代码。信不信由你,在某些情况下,情况正好相反。如果你想练习python技能,请使用“扁平比嵌套好。稀疏比密集好”。我不确定是否将for循环压缩成一行会更有效。但我相信你最终会陷入一个非常复杂的混乱。我同意@leaf所说的不要写你无法理解的代码。这种微优化不会有多大帮助。不好的做法一般来说,更少的代码并不一定意味着更快的代码。信不信由你,在某些情况下,情况正好相反。如果你想练习你的python技能,请使用“扁平比嵌套好。稀疏比密集好”。谢谢你的编辑!下次我会更专业谢谢你的编辑!下次我会更专业一些