【问题标题】:Can't change the code to list comprehension无法将代码更改为列表理解
【发布时间】:2026-01-23 22:25:01
【问题描述】:

我的问题有点简单,但我似乎找不到答案。

我的代码中有以下行可以正常工作:

Uniquesample = np.matrix([[   1.   ,    0.   ],
                   [   2.   , -106.965],
                   [   3.   ,  -83.835],
                   [   4.   ,   12.5  ],
                   [   5.   , -141.6  ],
                   [   6.   ,  -17.25 ],
                   [   7.   ,  -94.785],
                   [   8.   ,  -26.785],
                   [   9.   , -125.835],
                   [  10.   ,    6.865],
                   [  11.   ,   16.23 ],
                   [  12.   ,   61.45 ],
                   [  13.   ,   42.625],
                   [  14.   , -163.655],
                   [  15.   , -116.3  ],
                   [  16.   ,   15.82 ],
                   [  17.   , -166.055],
                   [  18.   ,   90.025],
                   [  19.   ,   14.215],
                   [  20.   ,   82.465]])
L, W = Uniquesample.shape
ModelNumber = 8
Members = np.zeros((L,ModelNumber*W))

seq=[4, 7, 9, 2, 15, 16, 19]
i=0
Count = [7]
for j in seq:
    Members[:Count[i]:,W*i:W*(i+1)] = Uniquesample[j]

Ps:Uniquesample 是一个 800 x 2 矩阵,所以为了简单起见,我只放了前 20 行。 我尝试使用“列表理解”将 for 循环更改为另一种格式:

Members[:Count[i]:,W*i:W*(i+1)] = [Uniquesample[j] for j in seq]

但它不起作用。我收到以下错误:“ValueError: setting an array element with a sequence。请求的数组将超过最大维数2。”

事情是这样的。我是否将代码正确“翻译”为列表理解格式?

非常感谢

【问题讨论】:

  • 您能给我们看一个 sn-p / 演示 Members / UniqueSample 是什么,以便了解您想要做什么吗?
  • 您能否提供更多关于seqUniquesampleMembers 中的内容的上下文?我认为Uniquesample 是一个列表,而j 您正在尝试访问索引?
  • :Count[i]: 只是分割:Count[i] 的一种混淆方式,对吧?那是基础 Python array.array、numpy.ndarray、pandas DataFrame 吗? (编辑:你澄清它是一个 np.matrix)
  • 大家好,我更新了问题,提供了有关代码的更多信息。很抱歉之前丢失了。
  • 无法重现。我使用seq=[4, 7, 9, 2, 15, 16, 19],并用列表理解语句替换了for循环......它可以正常运行

标签: python matrix list-comprehension slice


【解决方案1】:

我在下面的例子中使用了seq=[4, 7, 9, 2, 15, 16, 19]。初始 Members 数组如下所示:

在 for 循环中,Members[:Count[i]:,W*i:W*(i+1)] = Uniquesample[j] 将用 for 循环中的最终值替换那些 7x2 元素(红色)。

但是列表理解 Members[:Count[i]:,W*i:W*(i+1)] = [Uniquesample[j] for j in seq] 会以不同的方式分配每个元素。

仅供参考,我使用的是 numpy 版本 '1.18.5',因此由于旧 numpy 版本,它可能无法在 www.onlinegdb.com 上正常运行。

【讨论】:

  • 谢谢!我像您一样将 seq 更改为 seq=[4, 7, 9, 2, 15, 16, 19] ,但仍然遇到与以前相同的错误。我正在将 Anaconda 与 Spyder 的最新版本一起使用。我更改了问题中的代码以帮助重现性。奇怪的是,我上传了文件并在 Google Colab 中运行它们并且它工作正常。会发生什么? Spyder 是否以任何方式拒绝计算列表理解?
  • 您是否尝试过重新启动 Spyder(重新启动),然后再次运行代码?
  • Spyder的python版本是3.8.10,numpy是1.20.2。 Google Colab 的版本是 3.7.10 和 1.19.5。我想我会像你一样尝试将我的 python 版本降级到 3.8.3 并尝试运行它
  • 我像你一样将 numpy 降级到 1.18.5 版,现在它在 Spyder 中运行没有错误。在较新的 numpy 版本中有一些东西将此列表理解结构标识为错误
  • 非常感谢您对 Black Raven 的帮助。我“失去”了三天试图修复这个错误。
【解决方案2】:

关键是,在第一个代码中,您每次都在 Members[:Count[i]:,Wi:W(i+1)] 中分配一个 Uniquesample[j] 项。首先将 Uniquesample[0] 分配给 Members[:Count[i]:,Wi:W(i+1)],然后将 Uniquesample[1] 分配给相同的 Members[:Count[i]:,W i:W(i+1)] 等等。

在您的第二个代码中,您尝试将 Uniquesample 项目列表放入一个位置,该位置只能容纳一个项目。这就是错误的原因。

【讨论】: