使用list和tuple索引Numpy数组会得到不同的结果?

Tej*_*jas 5 arrays indexing numpy python-3.x

示例代码:

import numpy as np
a = np.zeros((5,5))
a[[0,1]] = 1     #(list of indices)
print('results with list based indexing\n', a)

a = np.zeros((5,5))
a[(0,1)] = 1   #(tuple of indices)
print('results with tuple based indexing\n',a)
Run Code Online (Sandbox Code Playgroud)

结果:

results with list based indexing
 [[ 1.  1.  1.  1.  1.]
  [ 1.  1.  1.  1.  1.]
  [ 0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.]
  [ 0.  0.  0.  0.  0.]]

results with tuple based indexing
[[  0.   1.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]]
Run Code Online (Sandbox Code Playgroud)

正如您必须注意到的,使用列表索引数组给出的结果与使用相同索引的元组的结果不同.我正在使用python3和numpy版本1.13.3

使用list和tuple索引numpy数组的根本区别是什么?

wim*_*wim 5

按设计。 Numpy 的 getitem 和 setitem 语法不是duck-type,因为不同的类型用于支持不同的特性。这只是一个普通的旧__setitem__

a[(0,1)] = 1
Run Code Online (Sandbox Code Playgroud)

这和做一样a[0,1] = 1。在这两种情况下,ndarray 的 setitem 都接收两个参数:索引的元组(0, 1)和值1

a[[0,1]] = 1
Run Code Online (Sandbox Code Playgroud)

这是广播的特例。它通常会被写入a[0:2] = 1,但您也可以对其他行进行切片/变异,例如a[[0,1,3]]。标量1在分配中的第 0 行和第 1 行的所有列中被“拉伸”。