我可以在指定的索引处获得numpy数组的视图吗? (从“花式索引”看)

时间:2011-02-26 16:05:52

标签: python numpy

我需要的是一种获得“花式索引”(y = x [[0,5,21]])以返回视图而不是副本的方法。

我有一个数组,但我希望能够处理这个数组的一个子集(由索引列表指定),使得这个子集中的更改也被放入大的正确位置阵列。如果我只想对前10个元素做一些事情,我可以使用常规切片y = x [0:10]。这很有效,因为常规切片会返回一个视图。问题是如果我不想要0:10,而是任意一组索引。

有办法做到这一点吗?

4 个答案:

答案 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。