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.any
或 np.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 将 s
与 sets
中的每个元素进行比较。当我们将一个列表与另一个列表进行比较时,[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]
我有一个 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.any
或 np.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 将 s
与 sets
中的每个元素进行比较。当我们将一个列表与另一个列表进行比较时,[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]