Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么花式索引不同于numpy中的切片?_Python_Arrays_Numpy_Indexing - Fatal编程技术网

Python 为什么花式索引不同于numpy中的切片?

Python 为什么花式索引不同于numpy中的切片?,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我一直在学习奇妙的索引,但当我观察到以下代码的行为时,我有几个问题 据我了解, 花式索引是: ndArray[[0,1,2]] 及 切片是: ndArray[0:3] 现在,问题来了 一个numpy数组 arr = [ [1,2,3], [4,5,6], [7,8,9] ] 当我尝试建立索引时: arr[ [0,1], [1,2] ] >>> [2, 6] 当你切的时候 arr[:2, 1:] >>> [ [2, 3],

我一直在学习奇妙的索引,但当我观察到以下代码的行为时,我有几个问题

据我了解,
花式索引是:

ndArray[[0,1,2]]

切片是:
ndArray[0:3]


现在,问题来了 一个numpy数组

arr = [ [1,2,3],
        [4,5,6],
        [7,8,9] ]
当我尝试建立索引时:

arr[ [0,1], [1,2] ]
>>> [2, 6]
当你切的时候

arr[:2, 1:]
>>> [ [2, 3],
      [5, 6] ]
基本上,它们都应该返回二维数组,因为它们的意思相同,可以互换使用

:2 should be equivalent to [0,1]           #For rows
1: should be equivalent to [1,2]           #For cols

问题是: 为什么花式索引不能作为切片表示法返回?如何做到这一点


请开导我。
感谢

根据定义,奇特的索引和切片表现不同

因此,与其质疑原因,不如:

  • 能够识别/区分/区分它们(即,清楚地了解索引何时成为花式索引,何时是切片)

  • 注意它们在语义(结果)上的差异

在您的示例中:

在花式索引的情况下,为两个轴生成的索引“串联”组合(类似于
zip
函数“串联”组合两个输入序列的方式)。(用官方
numpy
文档的话说,这两个索引数组“迭代在一起”)。我们正在传递列表
[0,1]
用于索引轴
0
上的数组,并传递列表
[1,2]
用于索引轴
1
上的数组。索引数组
[0,1]
中的索引
0
仅与索引数组
[1,2]的对应的索引
1
组合
。类似地,索引数组
[0,1]
的索引
1
仅与索引数组
[1,2]的对应的索引
2
组合
。换句话说,索引数组不会以多对多的方式相互组合。所有这些都是关于奇特的索引

在切片的情况下,为axis
0
指定的切片
:2
概念上为axis
0
生成索引“0”和“1”;为axis
1
指定的切片
1:
概念上为axis
1
生成索引
2
与花式索引不同,它们以多对多的方式进行索引。因此,它们产生了四种组合,而不仅仅是两种组合


因此,花式索引和切片定义语义的关键区别在于,在花式索引的情况下,花式索引数组是迭代在一起的

我不明白为什么您会期望相同的结果。
arr[[0,1],[1,2]]
返回一个包含两个元素的列表:第0行第1列的第一个元素,第1行和第2列的第二个元素。
arr[:2,1::
返回一个包含第0-1行和第1-2列的二维子数组。这是预期和记录的行为:@ThomasSablik但当我执行arr[[0,1]]时~仅传递行列表意味着与arr[:2]相同因此,当与列组合时,它应该返回相同的结果!
2**2
2*2
2+2
返回相同的结果。这是否意味着运算符
**
*
+
总是要执行相同的操作?您发现了一种特殊情况,其中奇特的索引和切片返回相同的结果编程中最重要的规则之一是:不要期望任何东西。阅读文档。索引一维时,1:4和[1,2,3]选择相同的内容。但在2d中,一对列表与切片不同。请阅读完整的numpy索引文档。@ThomasSablik,我对您的解释感到满意,但问题是当我们“切片”时,我们被限制按顺序访问行或列。我的意思是arr[:3,2:]将按照0,1,2行和2,3列的顺序进行,无法从中间进行评估。要手动访问,我们会执行一种称为“花式索引”的操作。但作为其行为,我们不会获取整组行,而是获取它们相交的值。如果我要访问行=[0,2,1]和列=[1,0,2]要整行整列吗?谢谢你的回答。