生成重新映射的numpy数组作为视图。

时间:2012-04-04 21:03:45

标签: python numpy

我的问题的玩具箱:

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

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文档所指出的那样。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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,则可以通过索引花式视图而不是将其用作数组来节省一些时间。