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

2024-10-01 11:19:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下程序

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技能。在

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

^{pr2}$

我可以把它写成一个循环:

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,)一起广播”

任何帮助都将不胜感激。在

-尼克


Tags: lambdainimport程序mapfornprange
1条回答
网友
1楼 · 发布于 2024-10-01 11:19:42
Y=np.asarray([np.sum(np.exp(-(X[i,]-X[i, cols[0,j]])**2)) for i in range(Nrows) for j in range(Ncols2)]).reshape((Nrows,Ncols2))

>>> Y
array([[ 1.80902144,  1.38631883],
       [ 2.85771284,  1.38668872],
       [ 4.05494692,  4.05494692]])

这使用了list comp,几乎只在一行上执行for循环。在

^{pr2}$

这与这一点是一致的:

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,后面是{}

从来没有和纽比玩太多…我喜欢!在

相关问题 更多 >