gpt4 book ai didi

python - NumPy 列表理解语法

转载 作者:太空狗 更新时间:2023-10-29 17:36:41 25 4
gpt4 key购买 nike

我希望能够使用列表理解语法轻松处理 NumPy 数组。

例如,我想要类似下面明显错误的代码来重现同一个数组。

>>> X = np.random.randn(8,4)
>>> [[X[i,j] for i in X] for j in X[i]]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: arrays used as indices must be of integer (or boolean) type

避免使用 range(len(X) 的简单方法是什么?

最佳答案

首先,您不应该将 NumPy 数组用作列表的列表。

其次,让我们忘掉 NumPy;您的 listcomp 一开始就没有任何意义,即使对于列表列表也是如此。

在内部理解中,for i in X 将迭代 X 中的行。这些行不是数字,它们是列表(或者,在 NumPy 中,是一维数组),所以 X[i] 毫无意义。您可能需要 i[j]

在外部理解中,for j in X[i] 有同样的问题,但它有一个更大的问题:没有i 值。你有一个理解循环遍历每个 i inside 这个理解。

如果您对理解感到困惑,请将其写成明确的 for 语句,如 List Comprehensions 上的教程部分中所述。 :

tmp = []
for j in X[i]:
tmp.append([X[i,j] for i in X])

…扩展为:

tmp = []
for j in X[i]:
tmp2 = []
for i in X:
tmp2.append(X[i,j])
tmp.append(tmp2)

…这应该很明显这里出了什么问题。


我想你想要的是:

[[cell for cell in row] for row in X]

再次,将其转回显式 for 语句:

tmp = []
for row in X;
tmp2 = []
for cell in row:
tmp2.append(cell)
tmp.append(tmp2)

这显然是对的。

或者,如果您真的想使用索引(但您没有):

[[X[i][j] for j in range(len(X[i]))] for i in range(len(X))]

那么,回到 NumPy。在 NumPy 术语中,最后一个版本是:

[[X[i,j] for j in range(X.shape[1])] for i in range(X.shape[0])]

…如果你想按列优先顺序而不是行优先顺序,你可以(与列表列表不同):

[[X[i,j] for i in range(X.shape[0])] for j in range(X.shape[1])]

…但这当然会转置数组,这不是您想要做的。

不能做的一件事是在同一个表达式中混淆列优先顺序和行优先顺序,因为您最终会得到废话。


当然,正确复制数组的方法是使用copy方法:

X.copy()

正如转置数组的正确方法是:

X.T

关于python - NumPy 列表理解语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21360028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com