Seite 1 von 1

RuntimeWarning: invalid value encountered in greater

Verfasst: Donnerstag 21. Mai 2020, 20:00
von Lukas Kretschmann
Ich habe in folgendem Code diesen Fehler:

Code: Alles auswählen

RuntimeWarning: invalid value encountered in greater
und zwar in dieser Zeile:

Code: Alles auswählen

 mask = (np.abs(z) > infinity_border) & (image == 0)
Kann mir jemand helfen diesen Fehler zu beheben und mir sagen woran das liegt?

Ich bin noch recht neu in Python und wäre deshalb dankbar, wenn ihr die Veränderungen im Code in eurem Kommentar postet.

Code: Alles auswählen

import os
import time
from itertools import count, cycle
from pathlib import Path

import cv2
import matplotlib
from matplotlib import rc, animation
import matplotlib.colors as clr
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FFMpegWriter, FuncAnimation


COLOR_MAP = clr.LinearSegmentedColormap.from_list(
    "mycmap",
    [
        (1 - (1 - q) ** 4, c)
        for q, c in zip(
            np.linspace(0, 1, 20), cycle(["#ffff88", "#000000", "#ffaa00"])
        )
    ],
    N=2048,
)

MAX_FRAMES = 2
#
# MAX_ZOOM for these coordinates (0.357535415497125, 0.070571561552046)
# 1.7592187E13 can go higher but it is possible that it zooms into a non
# borderregion region but 1.7592187E13 is already a huge zoom-factor
#
MAX_ZOOM = 100000
RMIN, RMAX, IMIN, IMAX = -2.5, 1.5, -2, 2
OUTPUT_FILENAME = "OUTPUT.mp4"
IMAGES_PATH = Path("data")

def mandelbrot(
    rmin,
    rmax,
    rpoints,
    imin,
    imax,
    ipoints,
    max_iterations=1000,
    infinity_border=10
):
    image = np.zeros((rpoints, ipoints))
    r, i = np.mgrid[rmin:rmax:(rpoints * 1j), imin:imax:(ipoints * 1j)]
    c = r + 1j * i
    z = np.zeros_like(c)
    for k in range(max_iterations):
        z = z ** 2 + c
        mask = (np.abs(z) > infinity_border) & (image == 0)
        image[mask] = k
        z[mask] = np.nan
    return -image.T


def init():
    return plt.gca()


def animate(frame_number):
    #
    # Standard:  0.357535415497125, 0.070571561552046
    #
    r_center, i_center = 0.340037926617566, -0.051446751669 
    zoom = (frame_number / MAX_FRAMES) ** 3 * MAX_ZOOM + 1
    scalefactor = 1 / zoom
    rmin_ = (RMIN - r_center) * scalefactor + r_center 
    imin_ = (IMIN - i_center) * scalefactor + i_center
    rmax_ = (RMAX - r_center) * scalefactor + r_center
    imax_ = (IMAX - i_center) * scalefactor + i_center
    #
    # Increase rpoints and ipoints for better resolution.
    #
    image = mandelbrot(rmin_, rmax_, 1000, imin_, imax_, 1000)
    plt.axis('off', bbox_inches='tight', pad_inches = 0, tight_layout=True)
    plt.imshow(image, cmap=COLOR_MAP, interpolation='none')
    #
    # Counter starts with zero; so last frame number is MAX_FRAMES - 1.
    #
    print(
        "Frame number {} created; next frame: {} | {:.2%}".format(
            frame_number, frame_number + 1, (frame_number + 1) / MAX_FRAMES
        )
    )
    
    
def cut_frames(video_filename, target_path):
    video = cv2.VideoCapture(video_filename)
    try:
        #
        # create a directory named data
        #
        try:
            target_path.mkdir(exist_ok=True)
            #
            # if directory was not created then raise an error
            #
        except OSError:
            print("Error: Creating directory for data failed")
        else:
            #
            # frame
            #
            currentframe = 0
            for frame_number in count():
                is_ok, frame = video.read()
                if not is_ok:
                    break
                #
                # if video is still left continue creating images
                #
                image_filename = './data/frame' + str(currentframe) + '.jpg'
                print("Creating...", image_filename)
                #
                # writing the extracted images 
                #
                cv2.imwrite(image_filename, frame)
                #
                # increasing counter so that it will 
                # show how many frames are created
                #
                currentframe +=1
    finally:
        video.release()
        cv2.destroyAllWindows() 

        
def main():
    rc('animation', html='html5')
    fig_size = 8
    fig = plt.figure(
        figsize=(fig_size, fig_size), 
        dpi = 150,
        tight_layout=True
    )
    Writer = animation.writers['ffmpeg']
    writer = animation.FFMpegWriter(
        fps=2,
        metadata=dict(artist='Lukas Kretschmann'),
        bitrate = -1, 
        extra_args=['-pix_fmt', 'yuv420p'] 
    )
    print("Video Processing")
    start_time = time.monotonic()
    anim = animation.FuncAnimation(fig, animate, init_func=init, frames=MAX_FRAMES, interval=150)
    anim.save('OUTPUT.mp4', writer=writer, dpi = 150)
    end_time = time.monotonic()
    print("Took:", end_time - start_time, "Next Step: Frame slicing")
    start_time = time.monotonic()
    cut_frames(OUTPUT_FILENAME, IMAGES_PATH)
    end_time = time.monotonic()
    print("Took:", end_time - start_time, " FINISHED")
    
    
if __name__ == "__main__":
    main()

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Donnerstag 21. Mai 2020, 20:44
von __blackjack__
Genau die gleiche Frage hast Du doch hier schon gestellt: viewtopic.php?f=1&t=48682

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Freitag 22. Mai 2020, 06:02
von Lukas Kretschmann
__blackjack__ hat geschrieben: Donnerstag 21. Mai 2020, 20:44 Genau die gleiche Frage hast Du doch hier schon gestellt: viewtopic.php?f=1&t=48682
Eine Antwort auf die Frage hätte ich dennoch gerne.

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Freitag 22. Mai 2020, 07:44
von Sirius3
Das ist ja kein Fehler sondern nur eine Warnung. Und es kommt daher, dass Du zwei Zeilen später nan in das Array schreibst.

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Freitag 22. Mai 2020, 09:54
von Lukas Kretschmann
Sirius3 hat geschrieben: Freitag 22. Mai 2020, 07:44 Das ist ja kein Fehler sondern nur eine Warnung. Und es kommt daher, dass Du zwei Zeilen später nan in das Array schreibst.
Dass das nur eine Warnung ist weiß ich ja, aber was könnte ich machen, dass diese Warnung nicht mehr kommt?

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Freitag 22. Mai 2020, 09:55
von __deets__
Nicht nan in das array schreiben.

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Freitag 22. Mai 2020, 17:59
von Lukas Kretschmann
__deets__ hat geschrieben: Freitag 22. Mai 2020, 09:55 Nicht nan in das array schreiben.
Wie soll ich es denn umsetzen im Code? Die Zeile kann ich ja nicht einfach weglassen.

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Freitag 22. Mai 2020, 18:41
von Lukas Kretschmann
Ich würde einfach gerne, dass diese Warnung beim ausführen des Codes nicht mehr erscheint, indem der Code so modifiziert wird, dass das so funktioniert.

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Samstag 23. Mai 2020, 10:16
von __deets__
Ich habe keine Lust da so tief einzusteigen, aber

- mit nans kann man nicht vergleichen.
- du benutzt die nans fuer irgendetwas. Wahrscheinlich sowas wie "unbelegt"
- wenn du dann aber mit einem konkreten Wert vergleichst, und als Ergebnis auch nur True/False erlaubt sind, dann beleg doch mit einem Wert vor, der an der Stelle das gewuenschte Ergebnis liefert.

Denn in deinem ganzen anderen Code kommt nan ja nicht mehr vor.

Re: RuntimeWarning: invalid value encountered in greater

Verfasst: Samstag 23. Mai 2020, 17:55
von Sirius3
@Lukas Kretschmann: dann lass das doch einfach weg.