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

时间:2018-02-26 16:19:13

标签: arrays python-3.x numpy indexing

示例代码:

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

正如您必须注意到的,使用list对数组进行索引会产生与使用相同索引的元组不同的结果。 我使用python3和numpy版本1.13.3

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

2 个答案:

答案 0 :(得分:4)

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

a[(0,1)] = 1

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

a[[0,1]] = 1

这是broadcasting的一个特例。它通常写为a[0:2] = 1,但您也可以切片/变异其他行,例如a[[0,1,3]]。标量1被拉伸"在任务中的第0行和第1行的所有列中。

答案 1 :(得分: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]被视为一个整数序列来访问数组的第一个维度,因为没有为剩余维度提及索引,所以默认情况下它被视为:,这导致{{1} }。

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

干杯!