2

这已经咬了我几次,我不知道这是一个错误还是一个功能。

nums = np.arange(10)
indx1 = np.array([2,4,6,8])
indx2 = np.array([0,3])

看起来我可以索引nums任何一种方式

nums[indx1][indx2], nums[indx1[indx2]]

输出(array([2, 8]), array([2, 8]))

如果我想重新分配这些值,这不起作用

nums[indx1][indx2] = 20
nums

输出array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

但这按预期工作:

nums[indx1[indx2]] = 20
nums 

输出array([ 0, 1, 20, 3, 4, 5, 6, 7, 20, 9])

为什么我必须嵌套索引数组而不是菊花链?

4

1 回答 1

0

这是我的想法。

尽管上述两种方法返回相同的结果,但在进行赋值操作时它们是不同的。


nums[indx1][indx2]可分为两temp = nums[indx]部分temp[indx2]

步骤 1.temp = nums[indx1]切片将创建一个的数组返回[2 4 6 8]

步骤 2.temp[indx2]将返回[2,8]

所以如果你尝试 nums[indx1][indx2] = 20,它相当于

temp = nums[indx1]
print(temp)
temp[indx2] = 20
print(temp)

这不会影响原始数组numsarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


为什么第二种方法有效?

indx1[indx2]返回[2, 8]

nums[[2,8]] = 20会给你array([ 0, 1, 20, 3, 4, 5, 6, 7, 20, 9])。它之所以有效,是因为您将值分配给原始数组nums

总的来说,第一个无法访问内存,nums但第二个可以。

于 2019-10-25T18:25:58.873 回答