RuntimeWarning: invalid value encountered in greater

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Lukas Kretschmann
User
Beiträge: 15
Registriert: Montag 4. Mai 2020, 21:20

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()
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Genau die gleiche Frage hast Du doch hier schon gestellt: viewtopic.php?f=1&t=48682
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lukas Kretschmann
User
Beiträge: 15
Registriert: Montag 4. Mai 2020, 21:20

__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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist ja kein Fehler sondern nur eine Warnung. Und es kommt daher, dass Du zwei Zeilen später nan in das Array schreibst.
Lukas Kretschmann
User
Beiträge: 15
Registriert: Montag 4. Mai 2020, 21:20

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?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht nan in das array schreiben.
Lukas Kretschmann
User
Beiträge: 15
Registriert: Montag 4. Mai 2020, 21:20

__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.
Lukas Kretschmann
User
Beiträge: 15
Registriert: Montag 4. Mai 2020, 21:20

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.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Lukas Kretschmann: dann lass das doch einfach weg.
Antworten