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

Python 使用列表理解代替两个for循环,python,list-comprehension,Python,List Comprehension,我正在尝试一次性实现这一点: W_jk = 0 if |j-k| > X 我尝试过这个,但似乎容易出错 W[i,j] = [0 if abs(i-j) > X for i in range(0,len(W)) for j in range(0,len(W[0]))] 还有别的选择吗?谢谢 [编辑1]:W=np.random.randn(m,d)对于某些m,d [编辑2]: 对于一个子问题,当j1-k1=j2-k2和| j1-k1 |编辑时,如果原始的W数据结构是一个NumPy数组

我正在尝试一次性实现这一点:

W_jk = 0 if |j-k| > X
我尝试过这个,但似乎容易出错

W[i,j] = [0 if abs(i-j) > X for i in range(0,len(W)) for j in range(0,len(W[0]))]
还有别的选择吗?谢谢

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

[编辑2]:


对于一个子问题,当j1-k1=j2-k2和| j1-k1 |编辑时,如果原始的
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)编辑如果原始的
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)没有一个条件,您显然希望将
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
但是,如果您不关心效率,只想使其成为一行代码,则可以使用以下列表理解,以便在不满足条件
|j-k |>X
时重用当前值:

W = [[0 if abs(i - j) > X else W[i][j] for j in range(len(W[i]))] for i in range(len(W))]
请注意,您问题中的
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=[[next((W[j2][k2]表示范围内的j2(len(W))表示范围内的k2(len(W[j2])),如果j1-k1==j2-k2和abs(j1-k1)您显然希望将
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
但是,如果您不关心效率,只想使其成为一行代码,则可以使用以下列表理解,以便在不满足条件
|j-k |>X
时重用当前值:

W = [[0 if abs(i - j) > X else W[i][j] for j in range(len(W[i]))] for i in range(len(W))]
请注意,您问题中的
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=[[next((W[j2][k2]对于范围内的j2(len(W))对于范围内的k2(len(W))(len(W[j2]))如果j1-k1==j2-k2和abs(j1-k1)来回答您的疑问,else条件将是else W1[i,j]W已经存在。我不是在理解中创建它。一个问题是你的解决方案将矩阵转换为列表。为了回答你的疑问,else条件将是else W1[I,j]W已经存在。我不是在理解中创建它的。一个问题是,您的解决方案将矩阵转换为列表。注意。但此解决方案也将矩阵转换为列表。我如何保留原始矩阵格式?我编辑了问题以显示Y形,您可以在以后将结果列表重新实例化为NumPy数组,尽管ugh再次强调,像第一个示例代码那样就地更新选择性值会更有效。好的。同样对于上面编辑的子问题,我们可以一次完成吗?我已经用子问题的解决方案更新了我的答案。的确。我已经更新了我的答案,改为使用生成器表达式。注意。但是这个解决方案也转换了matrix到列表。如何保留原始矩阵格式?我编辑了问题以显示Y形Y,您可以在之后将列表的结果列表重新实例化为NumPy数组,尽管同样,像第一个示例代码那样更新选择值更有效。好的。对于上面编辑的子问题,我们可以在一次性?我已经用你的子问题的解决方案更新了我的答案。的确。我已经更新了我的答案,改为使用生成器表达式。