From eeedb496b20b47bbed86ffa7586b5d7401d5e11f Mon Sep 17 00:00:00 2001 From: kuznetsovEA6 Date: Mon, 22 Sep 2025 13:14:46 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=D0=92=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20homework=5F04?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework_04/main.py | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 homework_04/main.py diff --git a/homework_04/main.py b/homework_04/main.py new file mode 100644 index 0000000..c747a42 --- /dev/null +++ b/homework_04/main.py @@ -0,0 +1,184 @@ + +# homework_04/media.py +# абстракции — через NotImplementedError + +class Storage: + """Абстракция хранилища.""" + def save(self, path, bytes_or_stream): + raise NotImplementedError + def load(self, path): + raise NotImplementedError + def delete(self, path): + raise NotImplementedError + def exists(self, path): + raise NotImplementedError + +class LocalStorage(Storage): + """Заглушки для локального диска.""" + def save(self, path, bytes_or_stream): + # открыть файл и записать bytes_or_stream + pass + def load(self, path): + # вернуть байты/поток + return None + def delete(self, path): + # удалить файл + pass + def exists(self, path): + return True + +class S3Storage(Storage): + """Заглушки для s3-like.""" + def __init__(self, bucket): + self.bucket = bucket + def save(self, path, bytes_or_stream): + # загрузить объект в bucket/path + pass + def load(self, path): + return None + def delete(self, path): + pass + def exists(self, path): + return True + +class MediaFile: + """Базовый медиа-файл.""" + def __init__(self, name, size=0, created_at=None, owner=None, + storage=None, path=None, meta=None): + self.name = name + self.size = size + self.created_at = created_at + self.owner = owner + self.storage = storage or LocalStorage() + self.path = path or name + self.meta = meta or {} # общие метаданные + + # --- CRUD --- + def save(self, bytes_or_stream=None): + """Сохранить контент и метаданные в storage по self.path.""" + self.storage.save(self.path, bytes_or_stream) + def load(self): + """Загрузить контент из storage.""" + return self.storage.load(self.path) + def delete(self): + """Удалить из storage.""" + self.storage.delete(self.path) + + # --- Бизнес-операции (заглушки) --- + def convert(self, **params): + """Сконвертировать в другой формат/профиль, вернуть новый объект.""" + raise NotImplementedError + def extract_features(self, **params): + """Извлечь фичи (превью, спектр, EXIF...), вернуть dict.""" + raise NotImplementedError + def validate(self): + """Проверить согласованность метаданных/контента.""" + return True + +class AudioFile(MediaFile): + """Аудио-метаданные: bitrate, sample_rate, channels, codec...""" + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.meta.setdefault("bitrate", None) + self.meta.setdefault("sample_rate", None) + self.meta.setdefault("channels", None) + self.meta.setdefault("codec", None) + + def convert(self, target_codec=None, bitrate=None, sample_rate=None, **_): + # вернёт новый AudioFile с обновлёнными метаданными/путём + new_name = self.name + ".conv" + return AudioFile(new_name, storage=self.storage, path=new_name, + meta={ + "bitrate": bitrate or self.meta["bitrate"], + "sample_rate": sample_rate or self.meta["sample_rate"], + "channels": self.meta["channels"], + "codec": target_codec or self.meta["codec"], + }) + + def extract_features(self, **_): + # вернёт, например, длительность и спектральные признаки + return {"duration_sec": None, "mfcc": None} + +class VideoFile(MediaFile): + """Видео-метаданные: resolution, fps, vcodec, acodec, duration...""" + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.meta.setdefault("resolution", None) + self.meta.setdefault("fps", None) + self.meta.setdefault("vcodec", None) + self.meta.setdefault("acodec", None) + self.meta.setdefault("duration", None) + + def convert(self, resolution=None, fps=None, vcodec=None, **_): + new_name = self.name + ".conv" + return VideoFile(new_name, storage=self.storage, path=new_name, + meta={ + "resolution": resolution or self.meta["resolution"], + "fps": fps or self.meta["fps"], + "vcodec": vcodec or self.meta["vcodec"], + "acodec": self.meta["acodec"], + "duration": self.meta["duration"], + }) + + def extract_features(self, **_): + # ключевые кадры, превью, цветовая гистограмма + return {"thumbnails": None, "keyframes": None, "color_hist": None} + +class PhotoFile(MediaFile): + """Фото-метаданные: width, height, exif, colorspace...""" + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.meta.setdefault("width", None) + self.meta.setdefault("height", None) + self.meta.setdefault("exif", {}) + self.meta.setdefault("colorspace", None) + + def convert(self, colorspace=None, size=None, **_): + new_name = self.name + ".conv" + new_meta = dict(self.meta) + if colorspace is not None: + new_meta["colorspace"] = colorspace + if size is not None: + new_meta["width"], new_meta["height"] = size + return PhotoFile(new_name, storage=self.storage, path=new_name, meta=new_meta) + + def extract_features(self, **_): + # гистограммы, лица, EXIF + return {"faces": None, "histogram": None, "exif": self.meta.get("exif", {})} + +# ---- Примеры использования ---- + +def examples(): + local = LocalStorage() + s3 = S3Storage(bucket="media") + + # Создание + a = AudioFile("song.mp3", storage=local, meta={"bitrate": 320, "sample_rate": 44100, "channels": 2, "codec": "mp3"}) + v = VideoFile("clip.mp4", storage=s3, meta={"resolution": "1920x1080", "fps": 30, "vcodec": "h264"}) + p = PhotoFile("pic.jpg", storage=local, meta={"width": 4000, "height": 3000, "colorspace": "sRGB"}) + + # Save / Load / Delete + a.save(bytes_or_stream=None) # записать контент + data = a.load() # прочитать + a.delete() # удалить + + # Действия + a2 = a.convert(target_codec="aac", bitrate=256) + feats_a = a.extract_features() + + v2 = v.convert(resolution="1280x720", fps=24) + feats_v = v.extract_features() + + p2 = p.convert(colorspace="AdobeRGB", size=(2048, 1536)) + feats_p = p.extract_features() + + # Работа с разными хранилищами прозрачно: + p2.save() + v2.save() + + + + + +if __name__ == "__main__": + examples() \ No newline at end of file From a4a166ffba741bfa92c3592c645f8196e2b204e4 Mon Sep 17 00:00:00 2001 From: evgenii1988 Date: Mon, 22 Sep 2025 13:34:32 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B8=2004?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework_04/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homework_04/main.py b/homework_04/main.py index c747a42..e9b9687 100644 --- a/homework_04/main.py +++ b/homework_04/main.py @@ -3,7 +3,7 @@ # абстракции — через NotImplementedError class Storage: - """Абстракция хранилища.""" + """Абстракция хранилищ.""" def save(self, path, bytes_or_stream): raise NotImplementedError def load(self, path): From 8e50e145039d79e1b111c5724ba7f3d1d0f3e63c Mon Sep 17 00:00:00 2001 From: evgenii1988 Date: Mon, 22 Sep 2025 17:17:43 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=94=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= =?UTF-8?q?=2005:=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B,=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=81=D0=BB=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- homework_05/base.py | 32 +++++++++++++++++-- homework_05/car.py | 9 ++++++ homework_05/engine.py | 7 +++++ homework_05/exceptions.py | 13 ++++++++ homework_05/plane.py | 25 +++++++++++++++ homework_05/test.py | 17 ++++++++++ homework_05/test_homework_05.py | 55 +++++++++++++++++++++++++++++++++ 7 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 homework_05/test.py create mode 100644 homework_05/test_homework_05.py diff --git a/homework_05/base.py b/homework_05/base.py index 9788beb..f69aee8 100644 --- a/homework_05/base.py +++ b/homework_05/base.py @@ -2,8 +2,34 @@ Доработайте класс `Vehicle` """ -from abc import ABC +from homework_05 import exceptions -class Vehicle(ABC): - pass +class Vehicle: + weight: int = 1500 + started: bool = False + + fuel: float = 0 + fuel_consumption: float = 0 + + def __init__(self, weight: int = 1500, fuel: float = 0, fuel_consumption: float = 0): + self.weight = weight + self.fuel = fuel + self.fuel_consumption = fuel_consumption + self.started = False + + def start(self): + """Запуск двигателя: проверяем топливо и меняем состояние""" + if not self.started: + if self.fuel > 0: + self.started = True + else: + raise exceptions.LowFuelError("Невозможно запустить двигатель — нет топлива") + + def move(self, distance: float): + """Проверка топлива и движение""" + fuel_needed = distance * self.fuel_consumption + if self.fuel >= fuel_needed: + self.fuel -= fuel_needed + else: + raise exceptions.NotEnoughFuel("Недостаточно топлива для движения") \ No newline at end of file diff --git a/homework_05/car.py b/homework_05/car.py index 1947f4b..ffffc7e 100644 --- a/homework_05/car.py +++ b/homework_05/car.py @@ -1,3 +1,12 @@ """ Создайте класс `Car`, наследник `Vehicle` """ +from homework_05.base import Vehicle +from homework_05.engine import Engine + + +class Car(Vehicle): + engine: Engine = None + + def set_engine(self, engine: Engine): + self.engine = engine \ No newline at end of file diff --git a/homework_05/engine.py b/homework_05/engine.py index d3c4b61..4c662a4 100644 --- a/homework_05/engine.py +++ b/homework_05/engine.py @@ -1,3 +1,10 @@ """ Создайте dataclass `Engine` """ +from dataclasses import dataclass + + +@dataclass +class Engine: + volume: float + pistons: int \ No newline at end of file diff --git a/homework_05/exceptions.py b/homework_05/exceptions.py index a3feff8..6f12072 100644 --- a/homework_05/exceptions.py +++ b/homework_05/exceptions.py @@ -4,3 +4,16 @@ - NotEnoughFuel - CargoOverload """ +class LowFuelError(Exception): + """Выбрасывается, если топлива недостаточно для запуска""" + pass + + +class NotEnoughFuel(Exception): + """Выбрасывается, если топлива недостаточно для движения""" + pass + + +class CargoOverload(Exception): + """Выбрасывается, если перегружен самолёт""" + pass \ No newline at end of file diff --git a/homework_05/plane.py b/homework_05/plane.py index 1f37f69..52832ae 100644 --- a/homework_05/plane.py +++ b/homework_05/plane.py @@ -1,3 +1,28 @@ """ Создайте класс `Plane`, наследник `Vehicle` """ +from homework_05.base import Vehicle +from homework_05 import exceptions + + +class Plane(Vehicle): + cargo: float = 0 + max_cargo: float + + def __init__(self, weight: int = 1500, fuel: float = 0, fuel_consumption: float = 0, max_cargo: float = 0): + super().__init__(weight, fuel, fuel_consumption) + self.max_cargo = max_cargo + self.cargo = 0 + + def load_cargo(self, cargo: float): + """Добавляем груз, проверяя перегруз""" + if self.cargo + cargo <= self.max_cargo: + self.cargo += cargo + else: + raise exceptions.CargoOverload("Превышен лимит груза") + + def remove_all_cargo(self) -> float: + """Возвращает старый груз и очищает трюм""" + old_cargo = self.cargo + self.cargo = 0 + return old_cargo \ No newline at end of file diff --git a/homework_05/test.py b/homework_05/test.py new file mode 100644 index 0000000..fd3242d --- /dev/null +++ b/homework_05/test.py @@ -0,0 +1,17 @@ +from homework_05.car import Car +from homework_05.engine import Engine +from homework_05.plane import Plane + +car = Car(fuel=50, fuel_consumption=5) +car.start() +car.move(5) +print(car.fuel) # остаток топлива + +engine = Engine(volume=2.0, pistons=4) +car.set_engine(engine) +print(car.engine) + +plane = Plane(fuel=100, fuel_consumption=10, max_cargo=200) +plane.load_cargo(100) +print(plane.cargo) +print(plane.remove_all_cargo()) \ No newline at end of file diff --git a/homework_05/test_homework_05.py b/homework_05/test_homework_05.py new file mode 100644 index 0000000..62b212a --- /dev/null +++ b/homework_05/test_homework_05.py @@ -0,0 +1,55 @@ +import pytest +from homework_05.base import Vehicle +from homework_05.car import Car +from homework_05.engine import Engine +from homework_05.plane import Plane +from homework_05 import exceptions + + +def test_vehicle_start_success(): + v = Vehicle(fuel=10, fuel_consumption=1) + v.start() + assert v.started is True + + +def test_vehicle_start_no_fuel(): + v = Vehicle(fuel=0, fuel_consumption=1) + with pytest.raises(exceptions.LowFuelError): + v.start() + + +def test_vehicle_move_success(): + v = Vehicle(fuel=10, fuel_consumption=2) + v.start() + v.move(3) # тратим 6 топлива + assert v.fuel == 4 + + +def test_vehicle_move_not_enough_fuel(): + v = Vehicle(fuel=5, fuel_consumption=2) + v.start() + with pytest.raises(exceptions.NotEnoughFuel): + v.move(10) + + +def test_car_set_engine(): + car = Car(fuel=20, fuel_consumption=5) + engine = Engine(volume=2.0, pistons=4) + car.set_engine(engine) + assert car.engine == engine + + +def test_plane_load_and_remove_cargo(): + plane = Plane(fuel=50, fuel_consumption=5, max_cargo=100) + plane.load_cargo(40) + assert plane.cargo == 40 + + removed = plane.remove_all_cargo() + assert removed == 40 + assert plane.cargo == 0 + + +def test_plane_overload(): + plane = Plane(fuel=50, fuel_consumption=5, max_cargo=50) + with pytest.raises(exceptions.CargoOverload): + plane.load_cargo(100) \ No newline at end of file From 293dd6e162de08cb1100b56128253fa1cbbde494 Mon Sep 17 00:00:00 2001 From: evgenii1988 Date: Mon, 22 Sep 2025 17:42:04 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=94=D0=BE=D0=BC=D0=B0=D1=88=D0=BA=D0=B0?= =?UTF-8?q?=2006:=20Git,=20shell,=20notebook=20+=20NOTES.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NOTES.md | 5 + homework_06/homework_06.ipynb | 200 +++++++++++++++++++++++++++------- 2 files changed, 166 insertions(+), 39 deletions(-) create mode 100644 NOTES.md diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..a18870f --- /dev/null +++ b/NOTES.md @@ -0,0 +1,5 @@ +Этот репозиторий — мой учебный форк курса **OTUS ML-Basic**. +Здесь я выполняю домашние задания по Python, ООП, Git, анализу данных и другим темам. + +Автор: Евгений Кузнецов (evgenii1988) +Группа: OTUS ML-Basic, 2025 \ No newline at end of file diff --git a/homework_06/homework_06.ipynb b/homework_06/homework_06.ipynb index 3c7a8a1..bd3b131 100644 --- a/homework_06/homework_06.ipynb +++ b/homework_06/homework_06.ipynb @@ -78,14 +78,15 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "id": "m9mteFtwc0jb" }, "outputs": [], "source": [ "def share_bread(N, K):\n", - " # your code here\n", + " x = K // N # целая часть деления — сколько каждому хоббиту\n", + " y = K % N # остаток — сколько останется в корзине\n", " return x, y\n", "\n", "# если в функции всё верно, то после выполнения этой строчки, не должно выскакивать ошибок\n", @@ -105,15 +106,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "id": "3SnU33pPc0jc" }, "outputs": [], "source": [ "def leap_year(year):\n", - " # your code here\n", - " return text_result\n", + " if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):\n", + " return \"YOU SHALL PASS\"\n", + " else:\n", + " return \"YOU SHALL NOT PASS\"\n", "\n", "assert leap_year(5) == 'YOU SHALL NOT PASS'" ] @@ -137,17 +140,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "id": "Uln7wcTVc0jd" }, "outputs": [], "source": [ + "import math\n", + "\n", "def amulet_area(a, b, c):\n", - " # your code here\n", - " return S\n", + " p = (a + b + c) / 2\n", + " s = math.sqrt(p * (p - a) * (p - b) * (p - c))\n", + " return s\n", + "\n", "\n", - "assert amulet_area(3, 4, 5) == 6" + "# проверка\n", + "assert round(amulet_area(3, 4, 5), 2) == 6.0" ] }, { @@ -171,32 +179,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "id": "_21LOuZRc0jd" }, "outputs": [], "source": [ + "import numpy as np\n", + "\n", "def cal_euclidean(a, b):\n", - " ## Your code here\n", + " distance = np.sqrt(np.sum((a - b) ** 2))\n", " return distance\n", "\n", "def cal_manhattan(a, b):\n", - " ## Your code here\n", + " distance = np.sum(np.abs(a - b))\n", " return distance\n", "\n", "def cal_cosine(a, b):\n", - " ## Your code here\n", - " return distance" + " dot = np.sum(a * b)\n", + " norm_a = np.sqrt(np.sum(a ** 2))\n", + " norm_b = np.sqrt(np.sum(b ** 2))\n", + " distance = 1 - dot / (norm_a * norm_b)\n", + " return distance\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { - "id": "fvyqAKchc0je" + "id": "fvyqAKchc0je", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "bf14acfd-ba0c-4f4c-9b00-3ab0c2a6e2c9" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "25.98076211353316\n", + "57\n", + "1.1672890268415814\n" + ] + } + ], "source": [ "a = np.random.randint(-10, 10, size=10)\n", "b = np.random.randint(-10, 10, size=10)\n", @@ -231,14 +258,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { - "id": "AFye6XzXc0je" + "id": "AFye6XzXc0je", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "aaa4fce0-47a0-45dd-ab9e-287827e79ba2" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Max: 1.0 Min: 0.0\n", + "[0. 1. 0.54985787 0.80679387 0.75201332 0.3828684\n", + " 0.18696161 0.13004481 0.76813654 0.77921254 0.45332468 0.62849992\n", + " 0.78504415 0.78442782 0.73730004 0.75588769 0.22370983 0.94910726\n", + " 0.05925698 0.9437643 0.30804907 0.52557853 0.33177858 0.47191657\n", + " 0.88771679 0.56370086 0.79570678 0.47481576 0.05501363 0.7727822\n", + " 0.10796825 0.24896448 0.25955606 0.89015722 0.72263037 0.71412375\n", + " 0.62678659 0.53372273 0.88397167 0.39846701 0.37776071 0.25225829\n", + " 0.39680671 0.16261257 0.05866501 0.63911592 0.27642229 0.06236445\n", + " 0.20573572 0.11365879 0.27924298 0.18815385 0.67075534 0.91101976\n", + " 0.3310395 0.7258281 0.24434622 0.93393506 0.97208782 0.59737267\n", + " 0.17563328 0.04735153 0.08516362 0.337134 0.27128127 0.29692172\n", + " 0.9673107 0.59594956 0.25300212 0.81366408 0.94547763 0.55058437\n", + " 0.28780929 0.80269246 0.01340543 0.08613363 0.290077 0.70475112\n", + " 0.39013012 0.57005674 0.62228908 0.01353195 0.33351377 0.5326668\n", + " 0.86576307 0.3661987 0.15067934 0.94953599 0.62386626 0.46184394\n", + " 0.65783727 0.41958679 0.14459175 0.72307703 0.24587256 0.00656726\n", + " 0.50411112 0.49230158 0.3881837 0.1127228 ]\n" + ] + } + ], "source": [ - "my_array = ## Your code here\n", - "print(np.max(my_array), np.min(my_array))\n", + "import numpy as np\n", + "\n", + "my_array = np.random.rand(100) # случайные числа в [0,1)\n", + "my_array[0] = 0 # ставим минимум\n", + "my_array[1] = 1 # ставим максимум\n", + "\n", + "print(\"Max:\", np.max(my_array), \"Min:\", np.min(my_array))\n", "print(my_array)" ] }, @@ -253,18 +314,39 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": { - "id": "SXaKW9bec0je" + "id": "SXaKW9bec0je", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "44c4dc94-1b1f-43f8-84ab-3b80b1db688f" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Shape: (5, 6)\n", + "Array:\n", + "[[29 19 39 39 4 23]\n", + " [ 5 26 33 40 44 50]\n", + " [13 43 36 8 33 46]\n", + " [42 35 12 42 5 48]\n", + " [13 49 31 14 22 29]]\n", + "Selected column: [23 50 46 48 29]\n" + ] + } + ], "source": [ - "my_array = ## Your code here\n", - "selected_column = ## Your code here\n", - "print('Shape: ',my_array.shape)\n", - "print('Array')\n", + "my_array = np.random.randint(0, 51, size=(5, 6)) # целые числа от 0 до 50\n", + "max_index = np.unravel_index(np.argmax(my_array), my_array.shape) # индекс макс. элемента\n", + "selected_column = my_array[:, max_index[1]] # берём колонку по номеру столбца\n", + "\n", + "print(\"Shape:\", my_array.shape)\n", + "print(\"Array:\")\n", "print(my_array)\n", - "print(selected_column)" + "print(\"Selected column:\", selected_column)" ] }, { @@ -278,24 +360,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": { "id": "75j1Kyzvc0je" }, "outputs": [], "source": [ "def get_unique_rows(X):\n", - " # Your code here\n", + " X_unique = np.unique(X, axis=0)\n", " return X_unique" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": { - "id": "HzY-9KwGc0je" + "id": "HzY-9KwGc0je", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "800386ae-c7a8-49d9-8ed3-c14ca461af1a" }, - "outputs": [], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[[4 4 4]\n", + " [4 4 4]\n", + " [5 5 4]\n", + " [5 4 5]\n", + " [5 4 5]\n", + " [4 4 4]\n", + " [4 4 4]\n", + " [4 4 4]\n", + " [4 5 5]\n", + " [4 4 5]]\n" + ] + } + ], "source": [ "X = np.random.randint(4, 6, size=(10,3))\n", "print(X)" @@ -303,11 +406,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { - "id": "UiAM62AGc0jf" + "id": "UiAM62AGc0jf", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "79628010-d7d3-4657-ba73-82cd6556caaa" }, - "outputs": [], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[4, 4, 4],\n", + " [4, 4, 5],\n", + " [4, 5, 5],\n", + " [5, 4, 5],\n", + " [5, 5, 4]])" + ] + }, + "metadata": {}, + "execution_count": 15 + } + ], "source": [ "get_unique_rows(X)" ] @@ -366,4 +488,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file