Python 对数组的列表理解

Python list comprehension over arrays

我有一个 numpy 数组列表,我正在尝试使用原始列表的所有元素创建一个新列表,一个除外。我有以下代码:

for i in xrange(FOLDS):
    #fold_sample_sets and fold_sample_labels are a list of 10 numpy arrays.
    training_samples = [s for s in fold_sample_sets if fold_sample_sets.index(s) != i]
    training_labels = [l for l in fold_label_sets if fold_label_sets.index(l) != i]

我已经在解释器中用小例子试过了,它似乎有效。但在这里我得到以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

关于如何解决这个问题有什么建议吗?

可以使用数组切片,

for i in range(FOLDS):
    # omit set #i from the list
    training_samples = fold_sample_sets[:i] + fold_sample_sets[i+1:]
    training_labels  = fold_label_sets [:i] + fold_label_sets [i+1:]

在你的理解中你有:

if fold_sample_sets.index(s) != i

if 的条件必须是 True/False。通常,当条件是一个包含多个元素的数组时,会产生此 ValueError。例如:

if np.array([True,False]):
    print(1)

这个条件是真还是假?或者两者兼而有之?它应该打印 1 还是不打印?

错误提示您使用 np.anynp.all 将多个值减少为一个。另一种方法是确保您没有将逻辑运算符应用于多元素数组。

什么是 fold_sample_sets.index(s) != i(对于 s 的典型值)?


sets = [np.ones((2,2))*i for i in range(5)]
[s for s in sets if sets.index(s)!=3]  # this error
sets.index(s)   # same error

看起来列表 .index 不适用于数组元素。为了计算这个索引,Python 将 ssets 中的每个元素进行比较。当我们将一个列表与另一个列表进行比较时,[1,2]==[3,4],我们得到一个简单的布尔值,False。但是当我们将一个数组与另一个数组进行比较时,我们会得到另一个数组:np.array([1,2])==np.array([3,4])array([False, False], dtype=bool)。这就是产生歧义的地方。

进行相同理解的更好方法(没有这个 .index)是:

[s for j,s in enumerate(sets) if j!=i]