使用列表和元组索引Numpy数组会得到不同的结果吗?

5

示例代码:

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)

结果:

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.]]

你可能已经注意到,用列表索引数组与使用相同索引的元组结果不同。 我正在使用Python3和Numpy版本1.13.3。
在使用列表和元组对numpy数组进行索引时,基本区别是什么?
2个回答

5

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

a[(0,1)] = 1

这与执行 a[0,1] = 1 相同。在两种情况下,ndarray 的 setitem 都接收两个参数:一个元组表示索引 (0, 1) 和值 1
a[[0,1]] = 1

这是广播的一个特例。通常会写成a[0:2] = 1,但你也可以切片/修改其他行,例如a[[0,1,3]]。在赋值过程中,标量1会被“拉伸”到所有第0行和第1行的列中。

明白了,谢谢。我也想到了另一种方式,把它写成答案。 - Tejas
列表案例也可以写成a[0,1], :]。这样更清晰地向人类表明,该列表选择了两个完整的行。 - hpaulj

0

我也在终端中尝试了以下情况。

a[[0],[1]] = 1
a[(0),(1)] = 1
a[(0,),(1,)] = 1

它们都等同于a [0,1] = 1

我从中理解到的是,Numpy期望使用N个不同的整数序列来索引N维数组。

也就是说,将数组索引为a [[0,1]]会导致a [ [0,1],:]

[0,1]被视为一个整数序列,用于访问数组的第一维,由于未提及其余维度的索引,因此默认情况下采用:,这导致a [[0,1],:]

wim的答案给了我这个想法的方向。

干杯!


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