微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我不知道为什么相同的代码适用于Julia但不适用于Mandelbrot?

如何解决我不知道为什么相同的代码适用于Julia但不适用于Mandelbrot?

我有以下代码生成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] # 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:该行的数组索引过多

pixel_rgb[:,i])

请,如何解决

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

import numpy as np
import matplotlib.pyplot as plt

def julia(C):
    X = np.arange(-1.5,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,'RGBA')
img.save('julia.tiff')
Image.open('julia.tiff').show()
print(min_value,max_value)

现在,我只是不知道为什么这种消除图像周围空白的代码对Mandelbrot不起作用?请帮助我找出问题所在!

解决方法

您的直接问题是在Julia情况下,pixel_rgb是三维数组,而在Mandelbrot情况下,pixel_rgb是一维数组。因此,您尝试对每个对象应用三维转换,这在Mandelbrot案例中很不完善,因为您要操作的对象只有一个维,而不是三维。

我没有更多的时间来完全理解和使用您的代码,但是在Mandelbrot的情况下,似乎mandelbrot()函数仅返回一个值,而julia()函数则返回2D阵列。 plot()函数在Mandelbrot情况下返回2D数组。因此,我对要进行的更改的快速猜测是更改此内容:

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

对此:

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

这允许Mandelbrot代码运行而不会崩溃。我不知道它是否确实在做您想要的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。