python – 生成重新映射的numpy数组作为视图.

我的问题的玩具箱:

我有一个numpy数组,比如1000:

import numpy as np
a = np.arange(1000)

我还有一个“投影数组”p,它是从a到另一个数组b的映射:

p = np.random.randint(0,1000,(1000,1000))

使用“花式索引”很容易得到b:

b = a[p]

但是b不是一个观点,正如先前几个问题/答案和numpy文档所指出的那样.

不幸的是,在我的情况下,只有在长时间模拟过程中的变化中的值以及在每次迭代中使用花式索引来获得b变得非常昂贵.我只读b,不要修改它.

我理解用幻想索引来解决这个问题是不可能的.

我想知道是否有人有类似的问题/瓶颈,并提出了一些其他的解决方法?

最佳答案 你要求的是不实际的,这就是为什么那些笨拙的人没有实现它.你可以用以下的东西自己做:

class FancyView(object):
    def __init__(self, array, index):
        self._array = array
        self._index = index.copy()
    def __array__(self):
        return self._array[self._index]
    def __getitem__(self, index):
        return self._array[self._index[index]]

b = FancyView(a, p)

但请注意,每次使用b作为数组时,都会调用昂贵的[p]操作.没有其他实践方法来制作这种“观点”. Numpy可以使用视图进行基本切片,因为它可以操纵步幅,但是没有办法使用步幅做这样的事情.

如果你只需要b的一部分,你可以通过索引花式视图而不是将它用作数组来节省一些时间.

点赞