在Python中将索引列表传递给另一个列表。正确的语法是什么?

4

所以我有以下来自sklearn的代码:

>>> from sklearn import cross_validation
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = cross_validation.KFold(4, n_folds=2)
>>> len(kf)
2
>>> print(kf)  
sklearn.cross_validation.KFold(n=4, n_folds=2, shuffle=False,
                           random_state=None)
>>> for train_index, test_index in kf:
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]
.. automethod:: __init__

当我在这些代码行中传递train_index和test_index时,它会给我一个错误(IndexError:索引超出范围):

...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]

为什么我不能将索引列表传递给另一个列表?正确的语法是什么,以便将索引列表传递给另一个列表,以获取该列表的这些元素?

我正在使用Python 2.7。

谢谢。


你的代码对我来说运行良好。 - Roger Fan
你的代码在我这里似乎可以工作,而且它似乎也可以在你自己的片段上工作。第一次调用和第二次调用之间有什么区别?第一次调用显示了正确的输出,而第二次则没有。 - logc
如同一个回答所述,我遇到了相同的问题,因为我试图将KFold应用于Python列表而不是numpy数组。 - Diedre
2个回答

7
与Numpy数组不同,Python列表不支持通过多个索引进行访问。
不过,使用列表推导式很容易解决这个问题:
l= range(10)
indexes= [1,3,5]
result= [l[i] for i in indexes]

或者稍微不那么易读但在某些场合更有用的map:
result= map(l.__getitem__, indexes)

然而,正如 Ashwini Chaudhary 指出的那样,在您的示例中,Xy numpy 数组,因此您要么输入了错误的示例代码,要么您特定的索引确实超出了范围。


在 OP 的情况下,Xy 不是 Numpy 数组吗? - Ashwini Chaudhary
@AshwiniChaudhary 确实,你发现得很好,我确实跳过了示例而直接回答了问题。 我已编辑了我的回答。 - loopbackbee
实际上,我输入了错误的示例代码。在我的情况下,X和y是数据框(DataFrames)。 - jenny

1
你也可以使用:


res_list = list(itemgetter(*index_list)(test_list)) 

编辑:

这是一个例子

>>> import operator
>>> indices = [1, 3, 4]
>>> list(operator.itemgetter(*indices)(range(10)))
[1, 3, 4]

你能提供 index_list 和 test_list 的示例吗? - NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接