用这些噪声参数填充2d numpy阵列的更快方法?当前在每个元素上循环

2024-05-19 15:05:20 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一种更快的方法可以使用这里看到的相同算法(使用相同输入参数的pnoise3,尤其是i/scale j/scale)填充2d numpy数组?self.world是np数组,像这样遍历它相当大(20481024)

for i in range(self.height):
    for j in range(self.width):

        self.world[i][j] = noise.pnoise3(i/self.noise['scale'], 
                                        j/self.noise['scale'], 
                                        SEED,
                                        octaves = self.noise['octaves'], 
                                        persistence = self.noise['persistence'], 
                                        lacunarity = self.noise['lacunarity'], 
                                        repeatx= self.width, 
                                        repeaty= self.height, 
                                        base= 0)

在学习了布尔索引之后,我在程序的其他地方摆脱了这个嵌套for循环,并惊讶于它的效率有多高。以上有改进的余地吗

我想做一些类似self.world[self.world is not None] = noise.pnoise3(arg, arg, etc...)的事情,但这不能适应递增的I和j值。将其设置为函数输出是否意味着每个值都是相同的?我还考虑过制作一个单独的数组,然后将它们组合起来,但我仍然不知道如何在这种情况下重现递增的I和j值

另外,顺便说一句,我将used self.world[self.world is not None]作为布尔索引的一个示例,该布尔索引将为所有内容返回true,但我认为这不是实现我所希望的最好方法。有没有我错过的明显的替代方案


Tags: 方法inselfforworldrange数组width
1条回答
网友
1楼 · 发布于 2024-05-19 15:05:20

如果pnoise是perlin噪声,则存在numpy矢量化实现。 这里是one

就目前情况而言,我认为你不能做得更快。当Numpy可以在C中执行内部循环时,它的速度很快。对于内置的Numpy函数,如np.sin,就是这样

这里有一个向量操作,其中的操作是python函数

但是,可以重新实现噪波函数,以便在内部使用numpy矢量化函数

相关问题 更多 >