Seite 1 von 1

KeyError bei Werteabfrage

Verfasst: Donnerstag 18. Juni 2020, 15:51
von Beginner2019
Hallo,
für eine HDR Rekonstruktion soll eine Funktion angelegt werden, die eine Gewichtungsmatrix erzeugt.
Die Form ist folgende:
def hatFun(x, l, m, h):
x ist die Eingangsmatrix, l der kleinste Wert, m der maximal Wert und h der höchste Wert.
Die result Matrix überführt den maximal wert in den wert 1, m und l in die Werte 0, so dass von l bis m die Werte linear bis 1 ansteigen und von m bis h
die Werte linear absteigen.

Meine idee war folgendes:

result=np.zeros(x.shape)
result[x<=l]=0
result[x>=h] =0
result[x<=m]= (x[x<=m]-l)*(1/m)
result[x<m]= (x[x<m]-m+1)*(1/(h-m))
return result

Es wird also eine Matrix angelegt, die an entsprechenden Stellen entsprechend befüllt werden soll. Das größte Problem ist, dass ich hier einen KeyError bekomme. Kann mir jemand sagen warum der Error geworfen wird?

Viele Grüße und danke im Vorraus :wink:

Re: KeyError bei Werteabfrage

Verfasst: Donnerstag 18. Juni 2020, 16:00
von __deets__
Bitte code-Tags verwenden, und den vollstaendigen Traceback zeigen.

Re: KeyError bei Werteabfrage

Verfasst: Donnerstag 18. Juni 2020, 16:13
von Beginner2019
Also die Funktion wird folgendermaßen angewendet:

fig, ax = plt.subplots( figsize=(15,7) )

x = np.linspace(-0.1, 1.1, 1000)
plt.plot( x, hatFun(x, 0.1, 0.4, 0.78 ) );
plt.grid( linestyle=':' )

# Reference how it schould look like:
newax = fig.add_axes( [0.59, 0.56, 0.3, 0.3], anchor='NE', zorder=1 )
newax.imshow( plt.imread('hat_fun_plot.png') / 0.8 + 0.1, interpolation = 'catrom' );
newax.axis('off')

Die Fehlermeldung sieht so aus:

---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
~\anaconda3\lib\site-packages\IPython\core\formatters.py in __call__(self, obj)
339 pass
340 else:
--> 341 return printer(obj)
342 # Finally look for special method names
343 method = get_real_method(obj, self.print_method)

~\anaconda3\lib\site-packages\IPython\core\pylabtools.py in (fig)
252 jpg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'jpg', **kwargs))
253 if 'svg' in formats:
--> 254 svg_formatter.for_type(Figure, lambda fig: print_figure(fig, 'svg', **kwargs))
255 if 'pdf' in formats:
256 pdf_formatter.for_type(Figure, lambda fig: print_figure(fig, 'pdf', **kwargs))

~\anaconda3\lib\site-packages\IPython\core\pylabtools.py in print_figure(fig, fmt, bbox_inches, **kwargs)
130 FigureCanvasBase(fig)
131
--> 132 fig.canvas.print_figure(bytes_io, **kw)
133 data = bytes_io.getvalue()
134 if fmt == 'svg':

~\anaconda3\lib\site-packages\matplotlib\backend_bases.py in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, **kwargs)
2063 orientation=orientation,
2064 dryrun=True,
-> 2065 **kwargs)
2066 renderer = self.figure._cachedRenderer
2067 bbox_artists = kwargs.pop("bbox_extra_artists", None)

~\anaconda3\lib\site-packages\matplotlib\backends\backend_svg.py in print_svg(self, filename, *args, **kwargs)
1200 detach = True
1201
-> 1202 result = self._print_svg(filename, fh, **kwargs)
1203
1204 # Detach underlying stream from wrapper so that it remains open in

~\anaconda3\lib\site-packages\matplotlib\backends\backend_svg.py in _print_svg(self, filename, fh, dpi, bbox_inches_restore, **kwargs)
1225 bbox_inches_restore=bbox_inches_restore)
1226
-> 1227 self.figure.draw(renderer)
1228 renderer.finalize()
1229

~\anaconda3\lib\site-packages\matplotlib\artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
36 renderer.start_filter()
37
---> 38 return draw(artist, renderer, *args, **kwargs)
39 finally:
40 if artist.get_agg_filter() is not None:

~\anaconda3\lib\site-packages\matplotlib\figure.py in draw(self, renderer)
1707 self.patch.draw(renderer)
1708 mimage._draw_list_compositing_images(
-> 1709 renderer, self, artists, self.suppressComposite)
1710
1711 renderer.close_group('figure')

~\anaconda3\lib\site-packages\matplotlib\image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
133 if not_composite or not has_images:
134 for a in artists:
--> 135 a.draw(renderer)
136 else:
137 # Composite any adjacent images together

~\anaconda3\lib\site-packages\matplotlib\artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
36 renderer.start_filter()
37
---> 38 return draw(artist, renderer, *args, **kwargs)
39 finally:
40 if artist.get_agg_filter() is not None:

~\anaconda3\lib\site-packages\matplotlib\axes\_base.py in draw(self, renderer, inframe)
2645 renderer.stop_rasterizing()
2646
-> 2647 mimage._draw_list_compositing_images(renderer, self, artists)
2648
2649 renderer.close_group('axes')

~\anaconda3\lib\site-packages\matplotlib\image.py in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
133 if not_composite or not has_images:
134 for a in artists:
--> 135 a.draw(renderer)
136 else:
137 # Composite any adjacent images together

~\anaconda3\lib\site-packages\matplotlib\artist.py in draw_wrapper(artist, renderer, *args, **kwargs)
36 renderer.start_filter()
37
---> 38 return draw(artist, renderer, *args, **kwargs)
39 finally:
40 if artist.get_agg_filter() is not None:

~\anaconda3\lib\site-packages\matplotlib\axis.py in draw(self, renderer, *args, **kwargs)
1203 ticks_to_draw = self._update_ticks()
1204 ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw,
-> 1205 renderer)
1206
1207 for tick in ticks_to_draw:

~\anaconda3\lib\site-packages\matplotlib\axis.py in _get_tick_bboxes(self, ticks, renderer)
1148 """Return lists of bboxes for ticks' label1's and label2's."""
1149 return ([tick.label1.get_window_extent(renderer)
-> 1150 for tick in ticks if tick.label1.get_visible()],
1151 [tick.label2.get_window_extent(renderer)
1152 for tick in ticks if tick.label2.get_visible()])

~\anaconda3\lib\site-packages\matplotlib\axis.py in (.0)
1148 """Return lists of bboxes for ticks' label1's and label2's."""
1149 return ([tick.label1.get_window_extent(renderer)
-> 1150 for tick in ticks if tick.label1.get_visible()],
1151 [tick.label2.get_window_extent(renderer)
1152 for tick in ticks if tick.label2.get_visible()])

~\anaconda3\lib\site-packages\matplotlib\text.py in get_window_extent(self, renderer, dpi)
888 raise RuntimeError('Cannot get window extent w/o renderer')
889
--> 890 bbox, info, descent = self._get_layout(self._renderer)
891 x, y = self.get_unitless_position()
892 x, y = self.get_transform().transform_point((x, y))

~\anaconda3\lib\site-packages\matplotlib\text.py in _get_layout(self, renderer)
422
423 ret = bbox, list(zip(lines, zip(ws, hs), *xys.T)), descent
--> 424 self._cached[key] = ret
425 return ret
426

~\anaconda3\lib\site-packages\matplotlib\cbook\__init__.py in __setitem__(self, k, v)
647 if k not in self:
648 if len(self) >= self.maxsize:
--> 649 del self[self._killkeys[0]]
650 del self._killkeys[0]
651 self._killkeys.append(k)

KeyError: (0.5, 1.0, 'Valid r Pixels', 'white', 'baseline', 'center', 9159954051183808757, None, None, 72.0, , 1.2)

Re: KeyError bei Werteabfrage

Verfasst: Donnerstag 18. Juni 2020, 16:15
von __blackjack__
@Beginner2019: Namen schreibt man in Python klein_mit_unterstrichen. Also `hat_fun()` statt `hatFun()`. Falls das `fun` nix mit Spass zu hat sondern für Funktion stehen soll, dann hat das nix im Namen zu suchen. Kryptische Abkürzungen in Namen sind schlecht. Was uns dann zu den Argumentnamen bring: WTF. Einbuchstabige Namen sind nur sehr selten aussagekräftig. `x` beispielsweise wenn der Wert für eine X-Koordinate steht. `l` ist ein besonders schlechter Name weil der in vielen Schriftarten kaum oder gar nicht 1 unterscheidbar ist.

Ein Array mit 0en zu erstellen und dann in den ersten beiden Schritten ausgewählte 0en durch 0en zu ersetzen erscheint wenig sinnvoll.

Re: KeyError bei Werteabfrage

Verfasst: Donnerstag 18. Juni 2020, 16:19
von __blackjack__
@Beginner2019: Was passiert wenn Du das Programm mal normal ausführst und nicht aus einer IPython-Shell heraus?

Re: KeyError bei Werteabfrage

Verfasst: Donnerstag 18. Juni 2020, 19:38
von Beginner2019
Hat sich erledigt, danke euch! :D