Python 将重新映射的numpy数组生成为视图。
解决我问题的玩具箱: 我有一个numpy数组大小,比如说1000:Python 将重新映射的numpy数组生成为视图。,python,numpy,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: 但正如前面的几个问题/答案和numpy文档所指出的那样,b不是一种观点 不幸的是,在我的例子中,只有a中的值在长时间的模拟过程中发生变化,并且在每次迭代中使用奇特的索引来获
import numpy as np
a = np.arange(1000)
我还有一个“投影数组”p,它是从a到另一个数组b的映射:
p = np.random.randint(0,1000,(1000,1000))
使用“花式索引”很容易从a获得b:
但正如前面的几个问题/答案和numpy文档所指出的那样,b不是一种观点
不幸的是,在我的例子中,只有a中的值在长时间的模拟过程中发生变化,并且在每次迭代中使用奇特的索引来获得b变得非常昂贵。我只从b读取,不修改它
我明白用花哨的索引来解决这个问题是不可能的
我想知道是否有人遇到过类似的问题/瓶颈,并想出了其他解决办法?你的要求并不实际,这就是为什么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)
但是请注意,每次将b
用作数组时,都会调用昂贵的a[p]
操作。没有其他的实践方式可以形成这种“观点”。Numpy可以不使用视图进行基本切片,因为它可以操纵步幅,但是没有办法使用步幅来做类似的事情
如果您只需要
b
的一部分,您可以通过索引奇特的视图而不是将其用作数组来节省一些时间。是否在每次迭代中都访问b
?如果是,没有比提取所有b
更便宜的方法了——您可能需要用其他方法改进算法。如果没有,您不需要构建b
,您可以使用a[p[i,j]]
,而不是访问b[i,j]
。这正是我所担心的:-)谢谢。
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)