使用列表理解代替两个for循环

2024-06-28 20:54:48 发布

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

我正试图一次性实现这一点:

W_jk = 0 if |j-k| > X

我试过了,但似乎很容易出错。在

^{pr2}$

有其他选择吗?谢谢。在

[编辑1]:W = np.random.randn(m,d)对于某些m,d

[编辑2]:

对于子问题,当j1-k1=j2-k2且j1-k1=j2=X时,W_j1k1=W_j2k2。这可以通过列表理解来实现吗?在


Tags: 编辑列表ifnpk2k1randomjk
2条回答

显然,您希望将0分配给现有列表列表W中的选择性项。如果是这样的话,使用嵌套的for循环有选择地更新项会更有效:

for i in range(len(W)):
    for j in range(len(W[i])):
        if abs(i - j) > X:
            W[i][j] = 0

但是,如果你不想使用下面的一行代码,那么请不要使用下面的代码:

^{pr2}$

请注意,您问题中的W[i,j]不是访问列表列表中项目的正确语法。您应该改用W[i][j]。在

编辑:对于您的子问题,您可以使用以下列表理解,尽管它不是通过任何方式优化的:

W = [[next((W[j2][k2] for j2 in range(len(W)) for k2 in range(len(W[j2])) if j1 - k1 == j2 - k2 and abs(j1 - k1) <= X), W[j1][k1]) for k1 in range(len(W[j1]))] for j1 in range(len(W))]

编辑如果您的原始W数据结构是一个NumPy数组,您可以进行一些奇特的索引以避免完全循环。在

import numpy as np
i = np.arange(W.shape[0])
j = np.arange(W.shape[1])
ii, jj = np.meshgrid(j, i)  # note the flipped indices!
absval = np.abs(ii - jj)
mask = absval > X
W[mask] = 0

这比嵌套循环快得多,效率也更高。在

原帖

几项准备工作:

首先,我注意到没有abs(i - j) <= X的条件,所以我包含了一个else 1条件。在

其次,我无法判断W是否已经存在(即,是预先分配的),或者您是在理解中创建的。我把它当作是存在的。在

第三,如果前一个问题的答案是W还不存在,那么在理解中使用{}本身就有问题。在

^{pr2}$

相关问题 更多 >