我希望对同一数据有两个不同的视图,其中行的顺序不同,这样通过一个视图所做的更改将反映在另一个视图中。具体如下代码
# Create original array
A = numpy.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
B = A.view()[[0, 2, 1], :] # Permute the rows
print("(before) B =\n", B)
# Change a value in A
A[1, 2] = 143
print("(after) A =\n", A)
print("(after) B =\n", B)
具有以下输出:
(before) B =
[[0 1 2]
[6 7 8]
[3 4 5]]
(after) A =
[[ 0 1 2]
[ 3 4 143]
[ 6 7 8]]
(after) B =
[[0 1 2]
[6 7 8]
[3 4 5]]
但我希望最后一点是
(after) B =
[[0 1 2]
[6 7 8]
[3 4 143]]
这个问题的答案表明,不可能在特定索引处查看视图,尽管该问题的 OP 正在询问数组的一个子集,而我想要整个数组的视图。(似乎这里的关键区别是切片与智能索引)
另一篇询问按行切片、然后按列切片、按列切片、然后按行切片的帖子有一个公认的答案,即“重要的是您是按行切片还是按列切片......”。所以我尝试处理阵列的扁平视图..
A = numpy.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
B = A.view()
B.shape = (A.size,)
A[1, 2] = 198
print("(After first) A =\n", A)
print("(After first) B =\n", B)
# Identity index map
all_idx = numpy.arange(A.size).reshape(A.shape)
# Swapped and flattened index map
new_row_idx = all_idx[[0, 2, 1]].flatten()
C = B[new_row_idx]
print("(Before second) C =\n", C)
# Manipulate through 'B'
B[7] = 666
print("(After second) B =\n", B)
print("(After second) C =\n", C)
给出以下输出:
(After first) A =
[[ 0 1 2]
[ 3 4 198]
[ 6 7 8]]
(After first) B =
[ 0 1 2 3 4 198 6 7 8]
(Before second) C =
[ 0 1 2 6 7 8 3 4 198]
(After second) B =
[ 0 1 2 3 4 198 6 666 8]
(After second) C =
[ 0 1 2 6 7 8 3 4 198]
如您所见,第 4 个条目C
没有改变。我提到的第一篇文章的建议解决方案是创建一个副本,进行更改,然后更新原始数组。我可以编写函数来包装它,但这并不能消除我复制的次数。它所做的只是对用户隐藏它。
我在这里想念什么?我应该使用data
这些数组的属性吗?如果是这样,了解如何做到这一点的一个好的起点是什么?