我的问题的玩具箱:
我有一个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 中读取,不要修改它。
我知道(还)可以用花哨的索引来解决这个问题。
我想知道是否有人有类似的问题/瓶颈,并提出了其他一些解决方法?
答案 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
,则可以通过索引花式视图而不是将其用作数组来节省一些时间。