对Python列表语法感到困惑

对Python列表语法感到困惑,python,python-2.7,numpy,scikit-learn,Python,Python 2.7,Numpy,Scikit Learn,这是代码和相关文档(),我被这一行搞糊涂了,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) 提前感谢,, Lin您的困惑是可以理解的:这绝对不是“标准”Python 数据。在本例中,目标是来自

这是代码和相关文档(),我被这一行搞糊涂了,
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)
提前感谢,,
Lin

您的困惑是可以理解的:这绝对不是“标准”Python

数据。在本例中,目标是来自numpy的:

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'>
[1]中的
:从sklearn.dataset导入加载
…:data=load_iris()
…:打印数据。目标[[10,25,50]]
…:打印列表(数据.目标名称)
[0 0 1]
['setosa','versicolor','virginica']
In[2]:打印类型(data.target)
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'>
[13]中的
:data.target
出[13]:
数组([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, 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
在[15]中:data.target[[1,2,3]]
Out[15]:数组([0,0,0])
在[16]中:打印类型(data.target[[1,2,3]])
而且它很可能通过以下方式做到这一点


有关更多信息,请参阅NumPy数组文档:

这是使用“整数索引”语法(与通常的下标相反)从NumPy数组
a
检索元素,即整数
B
列表将用于查找
a
中特定索引处的元素。您的输出是一个numpy数组,其形状与用作“输入”的列表
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维输入列表,影响输出形状:

还请注意,您也可以使用numpy数组而不是列表执行“整数索引”,例如

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

@TigerhawkT3看起来像是从
数据索引的
[10,25,50]
。目标array@TigerhawkT3,谢谢,投票赞成。我尝试了打印类型(data.target)
,返回的是
。困惑的是,包含单个元素的列表是什么意思,您能再详细说明一下吗?谢谢。@cricket\u 007,谢谢并投票赞成,但是为什么要使用double
[[]]
?那么你对NumPy数组而不是Python列表感到困惑。谢谢@cricket\u 007,投票赞成。那么,在
[[10,25,50]
中,double
[[[]]]
的含义是什么呢?谢谢Christian,投票支持这个全面的回答,所以它意味着从
numpy
数组
data.target
中检索
第10,25,50
个元素,以及Python中的新列表?如果是这样的话,
type(data.target[[10,25,50]])
应该是一个正式的Python列表,对吗?@LinMa看看答案中的最后一行代码,它仍然是一个
numpy.ndarray
谢谢@cricket_007,投赞成票。现在一切都清楚了在很多方面,你可以把一个
numpy.ndarray
当作一个列表(迭代、切分等),但如果你要这样做,我强烈建议你先阅读,因为有一些不标准的行为可能会绊倒你。谢谢Christian,投票并将你的回答标记为答案。
>>> a[numpy.array([0,3,2,4,1])]
  array([ 0,  9,  4, 16,  1])