python 数据索引请教

In [122]: arr = np.arange(32).reshape((8, 4))
In [123]: arr
Out[123]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
In [124]: arr[[1, 5, 7, 2], [0, 3, 1, 2]]
Out[124]: array([ 4, 23, 29, 10])

In [125]: arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
Out[125]:
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])

arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]
这个可以解释下是什么吗,谢谢。

阅读 1.5k
1 个回答
>>>type(arr)
<class 'numpy.ndarray'>

arr不是普通数组,支持对下标更灵活的使用。

arr[:]的意思是取全部元素。所以
arrarr[:]arr[:][:]是等价的。
理解这一点,就可以把 arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]表达式拆分来看。

首先 arr[[1, 5, 7, 2]] 是取原数组的第1,5,7,2这四行
即:

[ 4, 5, 6, 7], #1
[ 8, 9, 10, 11], # 2
[20, 21, 22, 23], #5
[28, 29, 30, 31] #7

按 1,5,7,2 顺序重排即为

[
[ 4, 5, 6, 7], #1
[20, 21, 22, 23], #5
[28, 29, 30, 31] #7
[ 8, 9, 10, 11], # 2
]

对上面的这个结果,姑且称作arrB, 再看表达式后半部分[:, [0, 3, 1, 2]], 这里逗号分为两个维度,取第一维的全部,即冒号:的作用,再取第二维的 0,3,1,2下标的元素。结果如你所见。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题