对Python列表语法感到困惑

时间:2016-08-20 23:57:14

标签: python python-2.7 numpy scikit-learn

以下是代码及相关文档(http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html#sklearn.datasets.load_iris),我对这一行感到困惑,data.target[[10, 25, 50]],为什么使用双[[]]感到困惑,如果有人能澄清,那就太棒了

from sklearn.datasets import load_iris
data = load_iris()
print data.target[[10, 25, 50]]
print list(data.target_names)
提前谢谢, 林

2 个答案:

答案 0 :(得分:1)

你的困惑是可以理解的:这不是标准"无论如何都是Python。

在这种情况下,

data.target是来自numpy的ndarray

In [1]: from sklearn.datasets import load_iris
   ...: data = load_iris()
   ...: print data.target[[10, 25, 50]]
   ...: print list(data.target_names)
[0 0 1]
['setosa', 'versicolor', 'virginica']

In [2]: print type(data.target)
<type 'numpy.ndarray'>

numpy的ndarray实现允许您通过提供所需项目的索引列表来创建新数组。例如:

In [13]: data.target
Out[13]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

In [14]: data.target[1]
Out[14]: 0

In [15]: data.target[[1,2,3]]
Out[15]: array([0, 0, 0])

In [16]: print type(data.target[[1,2,3]])
<type 'numpy.ndarray'>

并且可能由overriding __getitem__完成。

有关详细信息,请参阅NumPy阵列文档中的Indexing

答案 1 :(得分:1)

这是使用&#34;整数索引&#34;从numpy数组A中检索元素。语法(与通常的下标相对),即整数列表B将用于查找A中那些特定索引的元素。您的输出是一个numpy数组,其形状与您用作&#34;输入&#34;的列表B相同,输出元素的值是从A的值获得的那些整数指数,例如:

>>> import numpy
>>> a = numpy.array([0,1,4,9,16,25,36,49,64,81])
>>> a[[1,4,4,1,5,6,6,5]]
  array([ 1, 16, 16,  1, 25, 36, 36, 25])

整数索引可以应用于多个维度,例如:

>>> b = numpy.array([[0,1,4,9,16],[25,36,49,64,81]]) # 2D array
>>> b[[0,1,0,1,1,0],[0,1,4,3,2,3]]   # row and column integer indices
  array([ 0, 36, 16, 64, 49,  9])

或者,相同的示例但是具有 2 维度的输入列表,影响输出形状:

>>> b[[[0,1,0],[1,1,0]],[[0,1,4],[3,2,3]]] # "row" and "column" 2D integer arrays
  array([[ 0, 36, 16],
         [64, 49,  9]])

另请注意,您可以执行&#34;整数索引&#34;使用numpy数组,而不是列表,例如

>>> a[numpy.array([0,3,2,4,1])]
  array([ 0,  9,  4, 16,  1])