【问题标题】:I don't know why the same code works for Julia but not work for Mandelbrot?我不知道为什么相同的代码适用于 Julia 而不适用于 Mandelbrot?
【发布时间】:2020-08-30 05:39:11
【问题描述】:

我有以下代码可以生成 Mandelbrot 图像。图片周围的空白,必须去掉。

import numpy as np
import matplotlib.pyplot as plt
from pylab import *
from numpy import NaN

def mandelbrot(C):
    z = 0
    for n in range(1, 10):
        z = z**2 + C
        if abs(z) > 2:
            return n
    return NaN

def plot():
    X = np.arange(-2.0, 1.0, 0.05)
    Y = np.arange(-1.5, 1.5, 0.05)
    pixel = np.zeros((len(Y), len(X)))

    for x_iter, x in enumerate(X):
        for y_iter, y in enumerate(Y):
            pixel[y_iter, x_iter] = mandelbrot(x + 1j * y)

        imshow(pixel, cmap = 'gray', extent = (X.min(), X.max(), Y.min(), Y.max()))

    return pixel

pixel = mandelbrot(-0.7 + 0.27015j)
plt.axis('off')  
plot()
plt.show()

from PIL import Image
min_value = np.nanmin(pixel)
max_value = np.nanmax(pixel)
pixel_int = (255*(pixel-min_value)/(max_value-min_value)).astype(np.uint8)
# sample LUT from matplotlib
lut = (plt.cm.viridis(np.arange(256)) * 255).astype(np.uint8) # CHOOSE COLORMAP HERE viridis, jet, rainbow
pixel_rgb = lut[pixel_int]
# changing NaNs to a chosen color
nan_color = [0,0,0,0] # Transparent NaNs
for i,c in enumerate(nan_color):
  pixel_rgb[:,:,i] = np.where(np.isnan(pixel),c,pixel_rgb[:,:,i])
# apply LUT and display
img = Image.fromarray(pixel_rgb, 'RGBA')

print(pixel)

但结果是 IndexError: too many indices for array for the line

pixel_rgb[:,:,i] = np.where(np.isnan(pixel),c,pixel_rgb[:,:,i])

请问,如何解决?

实际上,为了消除图像周围的空白,几周前为 Julia 而不是 Mandelbrot 使用了相同的代码(同一行)。以下生成 Julia 图像的代码正在消除图像周围的空白。

import numpy as np
import matplotlib.pyplot as plt

def julia(C):
    X = np.arange(-1.5, 1.5, 0.05)
    Y = np.arange(-1.5, 1.5, 0.05)
    pixel = np.zeros((len(Y), len(X)))

    for x_iter, x in enumerate(X):
        for y_iter, y in enumerate(Y):
            z = x + 1j * y
            intensity = np.nan
            r = np.empty((100, 100)) # Unused at the moment
            for n in range(1, 1024):
                if abs(z) > 2:
                    intensity = n
                    break
                z = z**2 + C
            pixel[y_iter, x_iter] = intensity
            r.fill(intensity) # Unused at the moment

    # We return pixel matrix
    return pixel

# Compute Julia set image
pixel = julia(-0.7 + 0.27015j)

# Plotting
print(pixel)
plt.show()

from PIL import Image
min_value = np.nanmin(pixel)
max_value = np.nanmax(pixel)  
#want to set all the 255 pixels to removed
pixel_int = (255*(pixel-min_value)/(max_value-min_value)).astype(np.uint8)
# sample LUT from matplotlib,If lut is not None it must be an integer giving the number of entries desired in the lookup table
lut = (plt.cm.viridis(np.arange(256)) * 255).astype(np.uint8) # CHOOSE COLORMAP HERE viridis, jet, rainbow
pixel_rgb = lut[pixel_int]
# changing NaNs to a chosen color
nan_color = [0,0,0,0] # Transparent NaNs
for i,c in enumerate(nan_color):
  pixel_rgb[:,:,i] = np.where(np.isnan(pixel),c,pixel_rgb[:,:,i])
# apply LUT and display
img = Image.fromarray(pixel_rgb, 'RGBA')
img.save('julia.tiff')
Image.open('julia.tiff').show()
print(min_value, max_value)

现在,我只是不知道为什么这个去除图像周围空白的代码对 Mandelbrot 不起作用?!请帮我解决问题!

【问题讨论】:

    标签: python fractals mandelbrot


    【解决方案1】:

    您的直接问题是,在 Julia 案例中,pixel_rgb 是一个三维数组,而在 Mandelbrot 案例中,pixel_rgb 是一个一维数组。因此,您尝试对它们中的每一个应用一个三维变换,而这对于 Mandelbrot 案例来说很糟糕,因为您所操作的只有一个维度,而不是三个。

    我没有更多时间来完全理解和使用您的代码,但在 Mandelbrot 案例中,mandelbrot() 函数似乎只返回一个值,julia() 函数返回一个二维数组。在 Mandelbrot 案例中,plot() 函数返回一个二维数组。所以我对你想要做的改变的快速猜测是改变这个:

    pixel = mandelbrot(-0.7 + 0.27015j)
    plt.axis('off')
    plot()
    

    到这里:

    # pixel = mandelbrot(-0.7 + 0.27015j)
    plt.axis('off')
    pixel = plot()
    

    这允许 Mandelbrot 代码运行而不会崩溃。我不知道它是否完全符合您的要求。

    【讨论】:

    • 非常感谢,史蒂夫!您的猜测已准备就绪,即 X = np.arange(-2.0, 1.0, 0.005) 和 Y = np.arange(-1.5, 1.5, 0.005)
    • 酷。如果您认为它解决了您的问题,请单击复选标记将其标记为答案,或者如果仅部分回答了问题,请点赞。
    • 非常感谢!史蒂夫,你的猜测适用于这种情况 X = np.arange(-2.0, 1.0, 0.005), Y = np.arange(-1.5, 1.5, 0.005 )。但是,我不知道为什么它不适用于 0.001,0.002 的情况!当我使用 0.001 而不是 0.005 来获取具有 3000x3000pixels 的图像以用于应用目的时,会发生内存错误。这意味着我的程序以某种方式使用 pixel = plot() 创建了太多对象,我应该如何解决这个内存错误?史蒂夫!
    • 你唯一能做的就是编写更高效的内存代码,但做同样的事情。我的猜测是 Numpy 数组在内存方面效率低下,因为它设计用于轻松操作数据和存储所有不同类型数据的能力,并且对内存效率不感兴趣。我的方法是使用 Numpy 处理单行像素,然后将该行转换为简单的 Python 数组。这个简单的数组会占用更少的内存。所以你会使用 Numpy 来处理每一行,但你不会使用 Numpy 结构来存储整个图像。
    • 我只是想不出任何可以让我更有效地使用内存的代码。 Steve,你知道这些是什么以及如何将它们应用到代码中吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2022-10-01
    • 2022-11-21
    相关资源
    最近更新 更多