要查看而不是复制的 Numpy 链式索引 "force"
Numpy chained index "force" to be view rather than copy
基本上我希望这个链式切片覆盖值(将第一个元素显示为 2 而不是 1)
tst = np.array([1,2,3,4])
msk1 = [True, False, True, False]
msk2 = [True, False]
tst[msk1][msk2] = 2
tst
> array([1, 2, 3, 4])
此问题是tst[msk1]
是切片复制,不是视图。
您可以使用 tst[msk1].base
检查它 return 什么都没有(如果是视图,它将 return 原始数组)。所以当你进一步切片修改tst[msk1][mask2] = 2
时,实际上修改的是内存中的copy,而不是tst
.
据我所知,你cannot force a view with fancy indexing,所以你想要的东西不是直接可以实现的。
一个解决方法可能是获取第一个掩码的索引,然后用第二个掩码对它们进行切片:
idx = np.where(msk1)[0][msk2]
tst[idx] = 2
# print(tst)
# [2 2 3 4]
基本上我希望这个链式切片覆盖值(将第一个元素显示为 2 而不是 1)
tst = np.array([1,2,3,4])
msk1 = [True, False, True, False]
msk2 = [True, False]
tst[msk1][msk2] = 2
tst
> array([1, 2, 3, 4])
此问题是tst[msk1]
是切片复制,不是视图。
您可以使用 tst[msk1].base
检查它 return 什么都没有(如果是视图,它将 return 原始数组)。所以当你进一步切片修改tst[msk1][mask2] = 2
时,实际上修改的是内存中的copy,而不是tst
.
据我所知,你cannot force a view with fancy indexing,所以你想要的东西不是直接可以实现的。
一个解决方法可能是获取第一个掩码的索引,然后用第二个掩码对它们进行切片:
idx = np.where(msk1)[0][msk2]
tst[idx] = 2
# print(tst)
# [2 2 3 4]