1393 lines
82 KiB
Plaintext
1393 lines
82 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "a3bf87b4-95cf-4ba0-9a5b-0850aeaa69a9",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "2232b758-63e1-41d2-9408-179a53a85aa2",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-807eca211e1487aa",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"# 4. Programmierübung: NumPy\n",
|
|
"\n",
|
|
"<div style=\"display:flex;\">\n",
|
|
" <div style=\"text-align: left\">\n",
|
|
" Willkommen zur vierten Programmierübung Einführung in Python 3.\n",
|
|
" </div>\n",
|
|
" <img style=\"float: right; margin: 0px 15px 15px 0px\" src=\"https://www.python.org/static/img/python-logo-large.c36dccadd999.png?1576869008\" width=\"100\" />\n",
|
|
"</div>\n",
|
|
"\n",
|
|
"Wenn Sie Fragen oder Verbesserungsvorschläge zum Inhalt oder Struktur der Notebooks haben, dann können sie eine E-Mail an Phil Keier ([p.keier@hbk-bs.de](mailto:p.keier@hbk-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&)) oder Martin Le ([martin.le@tu-bs.de](mailto:martin.le@tu-bs.de?subject=[SigSys]%20Feedback%20Programmierübung&)) schreiben.\n",
|
|
"\n",
|
|
"Link zu einem Python Spickzettel: [hier](https://s3.amazonaws.com/assets.datacamp.com/blog_assets/PythonForDataScience.pdf)\n",
|
|
"\n",
|
|
"Der Großteil des Python-Tutorials stammt aus der Veranstaltung _Deep Learning Lab_ und von [www.python-kurs.eu](https://www.python-kurs.eu/python3_kurs.php) und wurde für _Signale und Systeme_, sowie _Einführung in die Programmierung für Nicht Informatiker_ angepasst.\n",
|
|
"\n",
|
|
"---"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "789f42fa-8c0c-4c9e-8949-d3899f3e4049",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-1cd501e6cecd8b4f",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"# Was ist NumPy\n",
|
|
"\n",
|
|
"NumPy steht für *Numerical Python*, ist OpenSource und wird mittlerweile von nahezu jedem Python Entwickeler verwendet. Dabei ist das Core Feature von NumPy seine effiziente Implementierung eines n-dimensionales Arrays in C, welches in Python verwendet werden kann. Hinzu kommt eine Hülle an Funktionen wie effiziente Zufallsalgorithmen und mathematische Funktionen aus den unterschiedlichten Bereichen der Statistik und numerischen Berechnung, welche alle für NumPy Arrays Optimiert sind. Im folgenden wollen wir den Umgang mit NumPy Arrays lernen. \n",
|
|
"\n",
|
|
"__Für dieses Notebook schauen Sie bitte in die [NumPy Docs](https://numpy.org/doc/stable/reference/index.html)!!!__ Dort sind alle Funktionen beschrieben die wir hier bearbeiten und noch mehr!\n",
|
|
"\n",
|
|
"---"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "0fc6f7d6-3d42-4890-8210-de78a1fb7458",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-4ae0a3d5075b3709",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Das gesamte Internet importiert NumPy mit dem Kürzel `np`. Um uns diesen ungeschriebenen Gesetz anzuschließen importieren wir in nächster Zelle NumPy als np:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 92,
|
|
"id": "f0d7d531-4c9a-429a-bd65-ad07fa06fdfc",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-50e3611287e2c68f",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import numpy as np"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c75e273d-8fa1-4618-8107-4820753b548e",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-b910cff04746aa1d",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"# Was ist ein Array?\n",
|
|
"\n",
|
|
"Ein Array ist eine kontinuierliche Datenstrucktur. Dabei werden die Daten in Reihe im Arbeitsspeicher hinterlegt, vergleichbar mit der Python Liste.\n",
|
|
"\n",
|
|
"## Erstellen von Arrays\n",
|
|
"\n",
|
|
"Alle folgenden Beispiele finden Sie im [Beginners Guide](https://numpy.org/doc/stable/user/absolute_beginners.html).\n",
|
|
"\n",
|
|
"Für unser erstes Beispiel erstellen wir aus einer Python liste ein [NumPy Array](https://numpy.org/doc/stable/reference/arrays.html)."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"id": "f7e32ba5-2ccc-47b0-82a7-a673cce4a5f1",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-1adaa95f01483572",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([1, 2, 3, 4, 5])"
|
|
]
|
|
},
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"arr = np.array([1,2,3,4,5])\n",
|
|
"arr"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "f9ea665d-900f-4e99-bddc-3ed990b0ac27",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-ea5067ebbb1c99bc",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Der Zugriff auf Elemente des Arrays erfolgt analog zu Pythons Liste:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"id": "7e5103ab-0a56-4a5f-a594-410d50a59e2a",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-cb73ac88e9fa5d93",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"5"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"arr[4]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "ccdab404-1ade-4622-a649-f1b7e594032a",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-ec0a814ecfda8547",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"NumPy Arrays sind n-dimensional, heißt Arrays in NumPy können aus geschachtelten Listen bestehen. Beispiel für ein 2-Dimensionales Array:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"id": "73b885f6-6fc8-4b45-ad60-d7a97ff3e0b1",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-ff72c8352626ac82",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([[1, 2, 3, 4, 5],\n",
|
|
" [6, 7, 8, 9, 8],\n",
|
|
" [7, 6, 5, 4, 3]])"
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"arr = np.array(\n",
|
|
" [\n",
|
|
" [1,2,3,4,5],\n",
|
|
" [6,7,8,9,8],\n",
|
|
" [7,6,5,4,3],\n",
|
|
" ])\n",
|
|
"arr"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "2de1bfe6-f584-406a-b9b2-a84bd7119ae1",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-413fcd639649e39a",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Diese Datenstrucktur wird Allgemein auch Matrix gennant. Der Zugriff auf ein Element einer Matrix folgt nach dem Prinzip \"Spalte->Reihe\". Die erste Spalte ist demnach:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"id": "f6a5cbff-1164-4a58-9821-d9dc1d22f413",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-c7a59ce293c8e402",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([1, 2, 3, 4, 5])"
|
|
]
|
|
},
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"arr[0]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "23357d46-1667-41fa-ae61-45d7919f946d",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-fb0cf79581b45e5e",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Der zugriff auf ein einzelnes element erfolgt dann analog:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"id": "329c8ce4-e8e3-4a4f-bfb9-0f14fe14bd1f",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-2f107dba2b747fbb",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"5"
|
|
]
|
|
},
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"arr[0][4]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "a8575708-b436-4835-94ce-dcab2a630c59",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-617d777cf3216789",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Oder mit der NumPys eigener Syntax `arr[<spalte>, <reihe>]`"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"id": "4dcd8136-5189-4bd1-a2f8-94380abe07a7",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-3e1e7323c57088ad",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"5"
|
|
]
|
|
},
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"arr[0, 4]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "235987ad-3ba9-4b2b-a516-7f4898f5a046",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-62701cdd045c7c4c",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Platzreservierung\n",
|
|
"\n",
|
|
"Falls bekannt ist wie viele Elemente ein Array im späteren Programmverlauf haben soll, bietet einem NumPy die möglichkeit diesen Platz im speicher gewissermaßen zu reservieren.\n",
|
|
"Hierfür gibt es einige Funktionen.\n",
|
|
"\n",
|
|
"### Ones\n",
|
|
"\n",
|
|
"1 Dimensionales NumPy Array der größe 10 mit 1 gefüllt:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"id": "a9473e4d-7632-4ad2-9dfc-9c1b45bbf4d1",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-d3aeedf2a30a9b30",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])"
|
|
]
|
|
},
|
|
"execution_count": 18,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"np.ones(10)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d88eddf1-8102-4fa6-9e77-870283782f4a",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-6e683d4afe40b7ff",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"### Zeros\n",
|
|
"\n",
|
|
"Analog dazu mit 0 gefüllt:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"id": "87464631-34db-4e04-8772-e423dc73c3c6",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-450f40270416767a",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
|
|
]
|
|
},
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"np.zeros(10)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "682a6ac2-23d7-48d8-af09-5c5cb571645d",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-ef1e55c1165e2de5",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"### Empty\n",
|
|
"\n",
|
|
"Analog mit zufälligen Werten (bzw. Werte die bereits an der Speicherstelle waren, meistens 0):"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 28,
|
|
"id": "e7bae7f4-85f0-4d40-a108-114281052de1",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-896e48c096be9062",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
|
|
]
|
|
},
|
|
"execution_count": 28,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"np.empty(10)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "dc587f64-5c44-41d8-b7f2-1c77e1833e45",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-947ed3289815694d",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"### Arange\n",
|
|
"\n",
|
|
"Analog dazu die `arange` Funktion (die Paramter sind die selben wie bei der Python `range` Funktion):"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 29,
|
|
"id": "87a59679-06ce-45a8-8a0c-1e38b5afa980",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-5329dd48e6129b33",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
|
|
]
|
|
},
|
|
"execution_count": 29,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"np.arange(10)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "bde3e4d6-27dc-4a15-b09b-1a803f2ede97",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-299417e99c41e05f",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"### Linspace\n",
|
|
"\n",
|
|
"Um später mit Matplotlib besser arbeiten zu können hat Numpy die [linspace](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy-linspace) Funktion. Welche die Werte von einem Start und End Punkt Linear berechnet, zusätzlich kann noch die Anzahl der Elemete mit dem `num` Parameter angegeben werden:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"id": "72a3c4e5-6a34-47c8-a6d9-0ee5f9344a7a",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-036bdec449f35dc5",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([ 0. , 2.5, 5. , 7.5, 10. ])"
|
|
]
|
|
},
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"np.linspace(0,10, num=5)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 31,
|
|
"id": "461fce96-5a91-475e-976b-aa529419ed7d",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-9ac9d3f215fc0237",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
},
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([ 400. , 466.66666667, 533.33333333, 600. ,\n",
|
|
" 666.66666667, 733.33333333, 800. , 866.66666667,\n",
|
|
" 933.33333333, 1000. ])"
|
|
]
|
|
},
|
|
"execution_count": 31,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"np.linspace(400, 1000, num=10)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "2399ddc1-70df-4ee0-af8c-c5e0c7123d09",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-522faf35a6c76300",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Aufgabe\n",
|
|
"\n",
|
|
"Erstellen Sie ein NumPy Array, welches 6 Nullen reserviert und speichern Sie das Array in der Variablen `only_zeros`. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 32,
|
|
"id": "a94c515e-aacb-42b1-813c-5b9ac16c062f",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-176f6befb5f45c58",
|
|
"locked": false,
|
|
"schema_version": 3,
|
|
"solution": true,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"only_zeros = None\n",
|
|
"# BEGIN SOLUTION\n",
|
|
"only_zeros = np.zeros(6)\n",
|
|
"# END SOLUTION"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 37,
|
|
"id": "66128e44-dbdb-40db-aa0d-ef73441ef7a1",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": true,
|
|
"grade_id": "cell-8ad1e3a41d459d55",
|
|
"locked": true,
|
|
"points": 1,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[0. 0. 0. 0. 0. 0.]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(only_zeros)\n",
|
|
"assert len(only_zeros) == 6\n",
|
|
"### BEGIN HIDDEN TESTS\n",
|
|
"for el in only_zeros:\n",
|
|
" assert el == 0\n",
|
|
"### END HIDDEN TESTS"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "91993511-9afc-4265-b88f-7507490fa77d",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-0108e88f3110e70f",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Aufgabe\n",
|
|
"\n",
|
|
"Erstellen Sie ein NumPy Array mit 11 Elementen mittels `linspace`, Dabei soll der Startwert = -4 und der Endwert = 17 sein. Speichern Sie das Ergbniss in der Variablen `x_scale`. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 38,
|
|
"id": "e8929ae8-a6e9-4fb5-bc9a-7d72493968cc",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-3231ee937ba8ab7a",
|
|
"locked": false,
|
|
"schema_version": 3,
|
|
"solution": true,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"x_scale = None\n",
|
|
"# BEGIN SOLUTION\n",
|
|
"x_scale = np.linspace(-4, 17, num=11)\n",
|
|
"# END SOLUTION"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 39,
|
|
"id": "3b8ac0eb-d7f8-44ef-a238-c8292409a096",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": true,
|
|
"grade_id": "cell-e5d66ef7599f7b91",
|
|
"locked": true,
|
|
"points": 1,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[-4. -1.9 0.2 2.3 4.4 6.5 8.6 10.7 12.8 14.9 17. ]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Hier werden ihre Lösungen getestet\n",
|
|
"print(x_scale)\n",
|
|
"assert len(x_scale) == 11\n",
|
|
"### BEGIN HIDDEN TESTS\n",
|
|
"s = np.linspace(-4, 17, num=11)\n",
|
|
"for el1, el2 in zip(x_scale, s):\n",
|
|
" assert el1 == el2\n",
|
|
"### END HIDDEN TESTS"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "0b581b99-4938-491e-bc56-b4090a8134e4",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-a33f2b356b5c882d",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Sortieren\n",
|
|
"\n",
|
|
"Es gibt viele Sortieralgorithmen in der freien Wildbahn des Internets NumPy hat dies für uns bereits implementiert.\n",
|
|
"Wollen wir im folgenden eine Liste sortieren nutzen wir die `sort` Funktion:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 40,
|
|
"id": "33d435f4-1326-4077-b39e-7da2886b4d90",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-598991a2c733ce85",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Unsortiertes Array: [ 14 9292 -1267 929 7 7\n",
|
|
" 42 -4294967297]\n",
|
|
"Sortiertes Array: [-4294967297 -1267 7 7 14 42\n",
|
|
" 929 9292]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"unsorted = np.array([14, 9292, -1267, 929, 7, 7, 42, -2**32-1])\n",
|
|
"print(\"Unsortiertes Array:\", unsorted)\n",
|
|
"sorted = np.sort(unsorted)\n",
|
|
"print(\"Sortiertes Array:\", sorted)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "9dcc9f48-aa79-43cf-a84e-5b0ab4d5fc05",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-8b154c89f933387e",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Aufgabe\n",
|
|
"\n",
|
|
"Ihnen ist das Array `pcgs` gegeben dieses enthält zufällige Zahlen eines _Permuted Congruent Generators_. Nutzen Sie Numpy um die Werte des Arrays `pcgs` zu sortieren. Speichern Sie ihr Ergebnis in der Variablen `sorted_pcgs`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "f011df4d-29ff-4064-b41f-6f008cc75674",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-2191ff9a88bb6ca0",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"20"
|
|
]
|
|
},
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Führen Sie diese Zelle aus bevor Sie die Aufgabe lösen\n",
|
|
"from numpy.random import SeedSequence, Generator, PCG64\n",
|
|
"sg = SeedSequence(42)\n",
|
|
"pcgs = [Generator(PCG64(s)).random()*100 for s in sg.spawn(20)]\n",
|
|
"len(pcgs)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 52,
|
|
"id": "ddc61400-dffb-4bce-8ebc-e610c532b68f",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-4b0e6942a521f2a6",
|
|
"locked": false,
|
|
"schema_version": 3,
|
|
"solution": true,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"sorted_pcgs = None\n",
|
|
"# BEGIN SOLUTION\n",
|
|
"sorted_pcgs = np.sort(pcgs)\n",
|
|
"# END SOLUTION"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 93,
|
|
"id": "08580054-e47d-43b0-a5d8-5b7addf27bc8",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-117b9c5d3b8c4bc3",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"# Visualisierung ihrer Lösung\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"%matplotlib inline\n",
|
|
"plt.plot(np.arange(len(sorted_pcgs)), pcgs, color='r', label='PCGs')\n",
|
|
"plt.plot(np.arange(len(sorted_pcgs)), sorted_pcgs, color='g', label='Sortierte PCGs')\n",
|
|
"plt.title(\"PCG Random Numbers\")\n",
|
|
"plt.legend()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 94,
|
|
"id": "84eccf42-7069-423d-a908-d2461f8347f5",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": true,
|
|
"grade_id": "cell-869d69a5298f07f5",
|
|
"locked": true,
|
|
"points": 1,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[ 0.1579146 1.75675021 7.12392029 7.23902481 15.50303392 20.10861125\n",
|
|
" 24.87079738 25.30205521 28.89761442 29.83032266 32.99327132 46.749078\n",
|
|
" 46.93021736 47.12091752 63.61856125 70.31144257 70.96566546 76.39328677\n",
|
|
" 85.49819194 91.67441576]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Hier werden ihre Lösungen getestet\n",
|
|
"print(sorted_pcgs)\n",
|
|
"### BEGIN HIDDEN SOLUTION\n",
|
|
"for s, t in zip(sorted_pcgs, np.sort(pcgs)):\n",
|
|
" assert s == t\n",
|
|
"### END HIDDEN SOLUTION"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "48b5d761-b906-4cef-b267-05e0fba53eeb",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-3d85ded8d3cf26fe",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Operationen auf Arrays\n",
|
|
"\n",
|
|
"NumPy hat die Operationen `+`, `-`, `*`, `/` und `%` alle von Haus aus Implementiert. Bei der Berechnung werden die Werte Suksessziv nacheinander miteinander Verküpft. Also `n1[0] + n2[0]`, `n1[1] + n2[1]`, ..., `n1[-1] + n2[-1]`,\n",
|
|
"\n",
|
|
"Schauen wir uns dazu die beiden Arrays `n1` & `n2` an."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 95,
|
|
"id": "32ad77b3-5411-42bb-a0c9-c2d098e2e945",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-a69046941c198fba",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"N1: [1 2 3 4]\n",
|
|
"N2: [11 12 13 14]\n",
|
|
"\n",
|
|
"N1 + N2: [12 14 16 18]\n",
|
|
"N2 - N1: [10 10 10 10]\n",
|
|
"N1 * N2: [11 24 39 56]\n",
|
|
"N1 / N2: [0.09090909 0.16666667 0.23076923 0.28571429]\n",
|
|
"N1 % N2: [1 2 3 4]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"n1 = np.arange(1, 5)\n",
|
|
"n2 = np.arange(11, 15)\n",
|
|
"\n",
|
|
"print(\"N1:\", n1)\n",
|
|
"print(\"N2:\", n2)\n",
|
|
"print()\n",
|
|
"print(\"N1 + N2:\", n1 + n2)\n",
|
|
"print(\"N2 - N1:\", n2 - n1)\n",
|
|
"print(\"N1 * N2:\", n1 * n2)\n",
|
|
"print(\"N1 / N2:\", n1 / n2)\n",
|
|
"print(\"N1 % N2:\", n1 % n2)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "0f067243-b0a2-4e42-8373-7a9e6a3ebfe3",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-96fcc4ed333e3844",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Das ganze Funktioniert nur und ausschließlich dann wenn beide Arrays dieselbe größe haben. Folglich läuft die Addition von Array `n1` mit Array `n3` auf einen Fehler, da Array `n3` 2 Elemente mehr Enthält:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 96,
|
|
"id": "0495d52f-905a-4720-ac98-78963848022c",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-e0da1d4c3a72f279",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"N3: [21 22 23 24 25 26]\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "ValueError",
|
|
"evalue": "operands could not be broadcast together with shapes (4,) (6,) ",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
|
|
"Cell \u001b[0;32mIn[96], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m n3 \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;241m21\u001b[39m, \u001b[38;5;241m27\u001b[39m)\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mN3:\u001b[39m\u001b[38;5;124m\"\u001b[39m, n3)\n\u001b[0;32m----> 3\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFehler N1 + N3:\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[43mn1\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mn3\u001b[49m)\n",
|
|
"\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (4,) (6,) "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"n3 = np.arange(21, 27)\n",
|
|
"print(\"N3:\", n3)\n",
|
|
"print(\"Fehler N1 + N3:\", n1 + n3)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "71155576-c6f8-4954-86ef-216190093749",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-8b7f52332c7aa8c6",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Shapes\n",
|
|
"\n",
|
|
"Um diesen Fehler vorzubeugen hat jedes NumPy Array den Parameter `shape`. Für `n1` ist dieser 4 und `n3` ist dieser 6."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 97,
|
|
"id": "5311416a-992d-4c93-8522-440094135009",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-102dbd7036166206",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Shape von N1: (4,)\n",
|
|
"Shape von N3: (6,)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(\"Shape von N1:\", n1.shape)\n",
|
|
"print(\"Shape von N3:\", n3.shape)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1a1914ad-d9bf-47f6-85bf-b9f62e33be37",
|
|
"metadata": {},
|
|
"source": [
|
|
"Vielleicht wundern Sie sich warum die Ausgabe `(4,)` bringt. Das liegt daran das Shape multidimensional ist. Schauen wir uns die Matrix `m` bestehend aus `n1` & `n2` an:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 98,
|
|
"id": "b3a16e98-3b1e-4bf3-87fa-918bd84b8956",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-bcec8661f2166849",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"M: [[ 1 2 3 4]\n",
|
|
" [11 12 13 14]]\n",
|
|
"Shape M: (2, 4)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"m = np.array([n1, n2])\n",
|
|
"print(\"M:\", m)\n",
|
|
"print(\"Shape M:\", m.shape)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "c7b66742-f5f6-47a7-bd07-eb489b8bbf39",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-b3f898e60d8e3617",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"Es ist dementsprechend wichtig den Shape zu prüfen wenn Sie sich nicht Sicher sind ob zwei Arrays miteinander verknüpft werden können:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 99,
|
|
"id": "dc836d79-b6ac-4386-9dbc-d26c3ce80551",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-048c10a814175dd3",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Error\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"if n1.shape == n3.shape:\n",
|
|
" print(\"N1 + N3:\", n1 + n3)\n",
|
|
"else:\n",
|
|
" print(\"Error\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "2b63c961-51da-4eb2-b749-caf1af15ff92",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-d3583eabd1371892",
|
|
"locked": true,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"source": [
|
|
"## Aufgabe\n",
|
|
"\n",
|
|
"Schauen Sie in die NumPy Dokumentation zur Funktion [reshape](https://numpy.org/doc/stable/reference/generated/numpy.reshape.html#numpy.reshape). Und shapen Sie das Array `n3` in eine Matrix der Form 3x2. Speicher Sie ihr Ergebnis in der Variablen `m23`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 100,
|
|
"id": "051ed23d-ca7e-417f-843f-39b3276d522d",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": false,
|
|
"grade_id": "cell-c41f34a6ae05874e",
|
|
"locked": false,
|
|
"schema_version": 3,
|
|
"solution": true,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"m23 = None\n",
|
|
"# BEGIN SOLUTION\n",
|
|
"m23 = n3.reshape((3, 2))\n",
|
|
"# END SOLUTION"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 104,
|
|
"id": "9fbbfd0b-49d9-47ea-9980-5df125ddb62a",
|
|
"metadata": {
|
|
"nbgrader": {
|
|
"grade": true,
|
|
"grade_id": "cell-973d2b07d04862ab",
|
|
"locked": true,
|
|
"points": 1,
|
|
"schema_version": 3,
|
|
"solution": false,
|
|
"task": false
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[[21 22]\n",
|
|
" [23 24]\n",
|
|
" [25 26]]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# Hier werden ihre Lösungen getestet\n",
|
|
"print(m23)\n",
|
|
"assert m23.shape == (3,2)\n",
|
|
"### BEGIN HIDDEN TESTS\n",
|
|
"l = n3.reshape((3, 2))\n",
|
|
"for s, t in zip(m23, l):\n",
|
|
" for el1, el2 in zip(s, t):\n",
|
|
" assert el1 == el2\n",
|
|
"### END HIDDEN TESTS"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"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.12.7"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|