gpt4 book ai didi

python - 生成一个重新映射的 numpy 数组作为 View 。

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:02 25 4
gpt4 key购买 nike

解决我的问题的玩具箱:

我有一个大小为 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 不是一个 View ,正如之前的几个问题/答案和 numpy 文档所指出的那样。

不幸的是,在我的例子中,只有 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 可以使用 View 进行基本切片,因为它可以操纵步幅,但是没有办法使用步幅来做这样的事情。

如果您只需要 b 的一部分,您可以通过索引精美的 View 而不是将其用作数组来节省一些时间。

关于python - 生成一个重新映射的 numpy 数组作为 View 。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com