Использование 2 возвращенных списков в качестве входных данных для другого метода - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь вычислить значения двух переменных в одном методе и затем вернуть их. Затем используйте возвращенные значения в качестве входных данных для другого метода, который графически отображает их - переменные содержат списки. Я не мог найти какую-либо соответствующую информацию для решения этой проблемы. Дальнейшая разработка приведена ниже, фрагмент кода.

Вот соответствующий код:

import numpy as np  #importing numpy for optimised arrays
import matplotlib.pyplot as plt  # importing module to graphically display arrays 

class Mandelbrot(object):  #creating class to generate a mandelbrot set
    def __init__(self,x1,x2,y1,y2,iterations,axis_points):  #initialising the relevant parameters
        self.iterations = iterations
        self.axis_points = axis_points
        self.x1 = x1
        self.x2 = x2
        self.y1 = y1
        self.y2 = y2

    def parameters(self):  #creating method to generate a list of evenly spaced numbers to create a 2D grid, 
        xrange = np.linspace(self.x1,self.x2,self.axis_points)  #then only storing numbers which are part of the mandelbrot set
        yrange = np.linspace(self.y1,self.y2,self.axis_points)
        count = 0
        counts = []
        full_grid = []
        for i in xrange:  #looping over every coordinate in the created grid to test if it is in the mandelbrot set
            for j in yrange:
                count = 0
                z = complex(0.0,0.0)  #initialising complex number to hold the iterations inside the while loop
                z_mag = 0
                full_grid.append((complex(i,j)))
                while z_mag <= 2:  #iterating until "point-of-no-return" thershold
                    z_mag = np.linalg.norm(z)  #optimised function to return the magnitude of the complex number
                    z =z**2 + complex(i,j)  #updating values of complex number 
                    count+=1
                    if z_mag > 2: 
                        counts.append(count)
                    elif count > 255:  #only adding to mandelbrot set if the number can pass a set number of iterations
                        counts.append(256)
                        break  #ending while loop to go to new coordinate on grid
        np_full_grid = np.array(full_grid)                
        return np_full_grid,counts

    def display(self):  #creating method to graphically display mandelbrot set       
        f, ax = plt.subplots()
        points = ax.scatter(self.real, self.imag, c=counts, s=1, cmap="prism")  #displaying filtered grid
        f.colorbar(points)  #generating colour bar from 

Вот мой тестовый код:

def main():
    M = Mandelbrot(-2.025,0.6,-1.125,1.125,255,200)  #setting parameters for the iteration
    generated_set = Mandelbrot.parameters(M)  #storing the list of mandelbrot set coordinates in complex plane
    Mandelbrot.display(generated_set)  #graphically displaying the generated mandelbrot set 
main()      

При возврате только np_full_grid и использовании его для метода отображения все работает , но мне также нужен доступ к списку счетов, чтобы правильно построить. Но когда я возвращаю np_full_grid и считает, он становится кортежем и личностью. больше не работает, как я могу получить доступ к обоим возвращенным значениям, которые будут использоваться в методе отображения? спасибо

Ответы [ 2 ]

3 голосов
/ 01 февраля 2020

Я не уверен, правильно ли я понял, но если вы хотите вернуть несколько переменных, вы можете сделать:

def foo():
    return a, b

c, d = foo()

Исходя из приведенного вами примера кода, вы вызываете функцию неправильно. Попробуйте это:

def main():
    M = Mandelbrot(-2.025,0.6,-1.125,1.125,255,200)  
    #setting parameters for the iteration
    generated_set, counts = M.parameters()  #storing  the list of mandelbrot set coordinates in complex plane
    M.display(generated_set)  #graphically 
displaying the generated mandelbrot set 

main()      

Причина в том, что M является экземпляром класса Мендельброта. Вы не передаете M функции, вы используете ее для вызова.

0 голосов
/ 01 февраля 2020

Хотя я принял ответ, я думаю, что этот код выполнен в более OOP стиле

Код метода отображения должен быть следующим:

def display(np_full_grid,counts):  #creating method to graphically display mandelbrot set       
        f, ax = plt.subplots()
        points = ax.scatter(np_full_grid.real, np_full_grid.imag, c=counts, s=1, cmap="viridis")  #displaying filtered grid
        f.colorbar(points)  #generating colour bar from 

Тестовый код должен быть:

def main():
    M = Mandelbrot(-2.025,0.6,-1.125,1.125,255,100)  #setting parameters for the iteration
    generated_set,counts = Mandelbrot.parameters(M)  #storing the list of mandelbrot set coordinates in complex plane and their corresponding count
    Mandelbrot.display(generated_set,counts)  #graphically displaying the generated mandelbrot set 
main()      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...