Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将重新映射的numpy数组生成为视图。_Python_Numpy - Fatal编程技术网

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

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中的值在长时间的模拟过程中发生变化,并且在每次迭代中使用奇特的索引来获

解决我问题的玩具箱:

我有一个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中的值在长时间的模拟过程中发生变化,并且在每次迭代中使用奇特的索引来获得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)