示例代码:
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数组的根本区别是什么?
答案 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的回答给了我这个想法的方向。
干杯!