如何使用 numpy 数组加速分形生成?

2024-04-30

这是我为使用牛顿方法制作分形而编写的一个小脚本。

import numpy as np
import matplotlib.pyplot as plt

f = np.poly1d([1,0,0,-1]) # x^3 - 1
fp = np.polyder(f)

def newton(i, guess):
    if abs(f(guess)) > .00001:
        return newton(i+1, guess - f(guess)/fp(guess))
    else:
        return i

pic = []
for y in np.linspace(-10,10, 1000):
    pic.append( [newton(0,x+y*1j) for x in np.linspace(-10,10,1000)] )

plt.imshow(pic)
plt.show()

我正在使用 numpy 数组,但仍然循环遍历 1000×1000 linspaces 的每个元素来应用newton()函数,它作用于单个猜测而不是整个数组。

我的问题是这样的:如何改变我的方法以更好地利用 numpy 数组的优势?

P.S.:如果您想尝试代码而不等待太久,最好使用 100×100。

额外背景:
请参阅牛顿法查找多项式的零点。
分形的基本思想是测试复平面中的猜测并计算收敛到零的迭代次数。这就是递归的意义所在newton(),最终返回步数。复平面中的猜测代表图片中的一个像素,由收敛步骤数着色。通过简单的算法,您可以得到这些美丽的分形。


我使用了 Lauritz V. Thaulow 的代码,并且能够通过以下代码获得相当显着的加速:

import numpy as np
import matplotlib.pyplot as plt
from itertools import count

def newton_fractal(xmin, xmax, ymin, ymax, xres, yres):
    yarr, xarr = np.meshgrid(np.linspace(xmin, xmax, xres), \
                             np.linspace(ymin, ymax, yres) * 1j)
    arr = yarr + xarr
    ydim, xdim = arr.shape
    arr = arr.flatten()
    f = np.poly1d([1,0,0,-1]) # x^3 - 1
    fp = np.polyder(f)
    counts = np.zeros(shape=arr.shape)
    unconverged = np.ones(shape=arr.shape, dtype=bool)
    indices = np.arange(len(arr))
    for i in count():
        f_g = f(arr[unconverged])
        new_unconverged = np.abs(f_g) > 0.00001
        counts[indices[unconverged][~new_unconverged]] = i
        if not np.any(new_unconverged):
            return counts.reshape((ydim, xdim))
        unconverged[unconverged] = new_unconverged
        arr[unconverged] -= f_g[new_unconverged] / fp(arr[unconverged])

N = 1000
pic = newton_fractal(-10, 10, -10, 10, N, N)

plt.imshow(pic)
plt.show()

对于 N=1000,使用 Lauritz 代码得到的时间为 11.1 秒,使用此代码得到的时间为 1.7 秒。

这里有两个主要的加速。首先,我使用 meshgrid 来加速输入值的 numpy 数组的创建。当 N=1000 时,这实际上是加速的一个非常重要的部分。

第二个加速来自于仅对未收敛部分进行计算。劳里茨(Lauritz)为此使用了屏蔽阵列,然后才意识到它们正在减慢速度。我已经有一段时间没有看过它们了,但我确实记得屏蔽数组在过去是缓慢的根源。我相信这是因为它们主要是通过 numpy 数组在纯 Python 中实现的,而不是像 numpy 数组一样几乎完全用 C 编写。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 numpy 数组加速分形生成? 的相关文章

随机推荐

  • 画笔到画笔动画

    我设法找到了如何制作 WPF 动画 两种颜色之间的过渡 它被称为 ColorAnimation 并且效果很好 ColorAnimation animation new ColorAnimation From Colors DarkGreen
  • 删除特定值之前和之后的特定值的运行

    我有一个包含几列的数据框 基于 activity 列 我想删除特定值 pt 的整个连续运行 但前提是它们紧邻 outside 运行之前或之后发生 在下面的简化数据中 有一次运行的 activity 为 outside 并且前后都有大块 pt
  • 可以删除 .nupkg 文件吗?

    我是 NuGet 的新手 刚刚开始使用它并给自己买了一份 WatiN 的副本 我正在尝试缩小在将其放入版本控制之前撤回的文件夹的大小 我注意到 WatiN 2 0 50 nupkg 约为 12mb 我注意到从这个链接 http nuget
  • Spark 使用自定义架构读取镶木地板

    我正在尝试使用自定义架构导入镶木地板格式的数据 但它返回 类型错误 option 缺少 1 个必需的位置参数 值 ProductCustomSchema StructType StructField id sku IntegerType T
  • 消除启动时的安全警告

    打开任何 MS Access 数据库时 都会出现安全警告 指出该文件可能对计算机有害 但是 有没有办法删除此消息 或者它应该仍然是一种必要的罪恶 您也许可以签署您的程序 我不确定 读本文 http www howto outlook com
  • 使用 std::istream_iterator 限制 std::copy 的范围

    我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题 我在用着istream iterator读书floatss 或其他类型 来自 astd istream include
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • 在Matlab中将矩阵中的元素i,j设置为i*j

    我想生成一个矩阵 其中 i j 元素等于 i j 其中 i j e g 0 2 3 2 0 6 3 6 0 到目前为止 我已经发现我可以使用这个索引矩阵访问非对角线元素 idx 1 eye 3 但我还没有弄清楚如何将矩阵单元的索引合并到计算
  • 如何使用 Python 将表格从 CSV 写入 PDF [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个CSV文件包含下表 users passwords company Admin test psw test cmp test
  • 资源目录不可用

    Eclipse 在问题选项卡中显示资源目录不可用 尽管它在项目文件夹树中可用 2012 09 11 12 14 43 QR01 ERROR resource directory D workspaceQR QR01 res does not
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 在展开转场停止转场后显示警报。如何确保展开转场完成后显示警报?

    我有一个从 A 视图控制器到 B 视图控制器的展开序列 在B中完成了一次网络操作 操作完成后 响应将显示在A视图控制器中 我成功地制作了这个结构 然而有一个问题 当我尝试显示警报时 它会显示但会停止继续 我如何确保在 segue 完成后显示
  • c 中的帕斯卡三角形与递归函数

    您好 这是我用于计算帕斯卡三角形的代码 但它运行错误 已停止工作 为什么 我认为它的错误在于 paskal 函数 include
  • 如何获取有权访问bigquery中的表的所有用户/组/服务帐户

    from pprint import pprint from google oauth2 import service account import googleapiclient discovery credentials service
  • 是否可以使用 Google Docs API 插入水平规则?

    我一直在开发一个项目 需要使用 PHP 将文本和其他类型的元素插入 Google 文档文档中 我可以使用以下代码插入文本 requests requests new Google Service Docs Request insertTex
  • 简化债务加权有向图的算法

    我一直在使用我编写的一个小Python脚本来管理室友之间的债务 它有效 但缺少一些功能 其中之一是简化不必要的复杂债务结构 例如 如果下面的加权有向图代表一些人 箭头代表他们之间的债务 爱丽丝欠鲍勃 20 美元 查理欠 5 美元 鲍勃欠查理
  • 从Python中的一行中删除标签

    我有一个具有以下架构的文本 word1 word2 br word3 word4 br 我想删除最后一部分 并将我的结果存储在另一个文件中 我已尝试以下操作 仍然没有将结果保存在其他文件中 def main fileR open test
  • 如何解决webview内容重叠的问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 嗨 当背景设置为透明时 如何解决we
  • 变量范围的 Java 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以指导我查看 java 文档以了解变量的范围 我想查看 java 8 中的类变量和成员变量的
  • 如何使用 numpy 数组加速分形生成?

    这是我为使用牛顿方法制作分形而编写的一个小脚本 import numpy as np import matplotlib pyplot as plt f np poly1d 1 0 0 1 x 3 1 fp np polyder f def