{ "cells": [ { "cell_type": "markdown", "id": "8722f7a6", "metadata": {}, "source": [ "# Bedingte Logik als Array-Operationen – `where`\n", "\n", "Die Funktion [numpy.where](https://numpy.org/doc/stable/reference/generated/numpy.where.html) ist eine vektorisierte Version von `if` und `else`." ] }, { "cell_type": "markdown", "id": "bf1cdc04", "metadata": {}, "source": [ "Im folgenden Beispiel erzeugen wir zunächst ein boolesches Array und zwei Arrays mit Werten:" ] }, { "cell_type": "code", "execution_count": 1, "id": "a2619151", "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "id": "d9aa7d1c", "metadata": {}, "outputs": [], "source": [ "cond = ([False, True, False, True, False, False, False])\n", "data1 = np.random.randn(1, 7)\n", "data2 = np.random.randn(1, 7)" ] }, { "cell_type": "markdown", "id": "e6c52a1d", "metadata": {}, "source": [ "Nun wollen wir Nehmen wir die Werte aus `data1` übernehmen, wenn der entsprechende Wert in `cond` `True` ist und ansonsten den Wert aus `data2` übernommen wird. Mit Pythons `if`-`else` könnte das wie folgt aussehen:" ] }, { "cell_type": "code", "execution_count": 3, "id": "3092a587", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([ 0.79741059, 1.01235915, -1.02336595, 0.34698571, 0.91228723,\n", " -0.3260451 , -0.38514407])]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = [(x if c else y) for x, y, c in zip(data1, data2, cond)]\n", "\n", "result" ] }, { "cell_type": "markdown", "id": "b0bf7258", "metadata": {}, "source": [ "Dies hat jedoch die folgenden beiden Probleme:\n", "\n", "* bei großen Arrays wird die Funktion nicht sehr schnell sein\n", "* dies funktioniert nicht mit mehrdimensionalen Arrays" ] }, { "cell_type": "markdown", "id": "f5e79bef", "metadata": {}, "source": [ "Mit `np.where` könnt ihr diese Probleme in einem einzigen Funktionsaufruf umgehen:" ] }, { "cell_type": "code", "execution_count": 4, "id": "513e5616", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.79741059, 0.29822359, -1.02336595, -0.75315847, 0.91228723,\n", " -0.3260451 , -0.38514407]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = np.where(cond, data1, data2)\n", "\n", "result" ] }, { "cell_type": "markdown", "id": "99602350", "metadata": {}, "source": [ "Das zweite und dritte Argument von `np.where` müssen keine Arrays sein; eines oder beide können auch Skalare sein. Eine typische Anwendung von `where` in der Datenanalyse besteht darin, ein neues Array von Werten auf der Grundlage eines anderen Arrays zu erzeugen. Angenommen, ihr habt eine Matrix mit zufällig generierten Daten und möchtet alle negativen Werte zu positiven Werten machen:" ] }, { "cell_type": "code", "execution_count": 5, "id": "19d8b8b3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.78389643, -0.43952108, 0.91911346, 0.12098948],\n", " [ 0.75084868, 0.36700152, -0.43154287, 0.90047307],\n", " [ 1.28823883, 0.20841103, -0.08082387, 1.12856954],\n", " [-0.48137952, -1.20155362, -0.7572543 , -0.29655235]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = np.random.randn(4, 4)\n", "\n", "data" ] }, { "cell_type": "code", "execution_count": 6, "id": "dfe4cacc", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ True, True, False, False],\n", " [False, False, True, False],\n", " [False, False, True, False],\n", " [ True, True, True, True]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data < 0" ] }, { "cell_type": "code", "execution_count": 7, "id": "3b6843fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.78389643, 0.43952108, 0.91911346, 0.12098948],\n", " [0.75084868, 0.36700152, 0.43154287, 0.90047307],\n", " [1.28823883, 0.20841103, 0.08082387, 1.12856954],\n", " [0.48137952, 1.20155362, 0.7572543 , 0.29655235]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(data < 0, data * -1, data)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.13 Kernel", "language": "python", "name": "python313" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.0" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }