我需要的是一种获得“花式索引”(y = x [[0,5,21]])以返回视图而不是副本的方法。
我有一个数组,但我希望能够处理这个数组的一个子集(由索引列表指定),使得这个子集中的更改也被放入大的正确位置阵列。如果我只想对前10个元素做一些事情,我可以使用常规切片y = x [0:10]。这很有效,因为常规切片会返回一个视图。问题是如果我不想要0:10,而是任意一组索引。
有办法做到这一点吗?
答案 0 :(得分:14)
我认为没有办法解决这个问题。我的理解是'花式索引'将始终返回副本。我能想到的最好的解决方案是操纵y
,然后使用相同的花哨索引来改变x
之后的值:
ii = [0, 5, 21]
y = x[ii]
<manipulate y>
x[ii] = y
答案 1 :(得分:2)
你可以这样做:
y = x[[0,1,4]]
func(y)
x[[0,1,4]] = y
我认为你不能通过花哨的索引获得意见。您可能不想,因为我认为花哨的索引非常慢,只需复制一次数据就会更快。
答案 2 :(得分:2)
这是一种模拟视图(一些语法糖)的可能方法,通过使用“花式视图上下文”来避免最后的显式复制语句。您需要注意您的代码不会修改上下文中的索引数组
import contextlib
@contextlib.contextmanager
def fancy_index_view(arr, inds):
# create copy from fancy inds
arr_copy = arr[inds]
# yield 'view' (copy)
yield arr_copy
# after context, save modified data
arr[inds] = arr_copy
现在,摘录
import numpy as np
foo = np.random.random((22,2))
row_inds = [0,5,21]
barview = foo[row_inds]
barview[::] = 1
foo[row_inds] = barview
可以替换为
import numpy as np
foo = np.random.random((22,2))
row_inds = [0,5,21]
with fancy_index_view(foo, row_inds) as barview:
barview[::] = 1
答案 3 :(得分:0)
理论上,您可以创建一个扮演“幻想”角色的对象。到另一个数组,我可以想到它的大量用例。问题是,这样的物体与标准的numpy机械不兼容。所有编译的numpy C代码都依赖于作为步幅和索引的内积可访问的数据。将此代码概括为根本不同的数据布局格式将是一项艰巨的任务。对于试图沿着这些方向挑战的项目,请查看连续统一的Blaze。