4

我的问题的玩具箱:

我有一个大小为 1000 的 numpy 数组:

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

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

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

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

b = a[p]

但是b不是一个视图,正如之前的几个问题/答案和 numpy 文档所指出的那样。

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

我知道(还)不可能用花哨的索引来解决这个问题。

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

4

1 回答 1

2

你的要求是不切实际的,这就是为什么 numpy 的人没有实现它。你可以自己做这样的事情:

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)

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

如果您只需要其中的一部分,b则可以通过索引花哨的视图而不是将其用作数组来节省一些时间。

于 2012-04-04T21:27:27.497 回答