Предпосылки
- Основы Python
- Numpy Основы
Итоги обучения из учебника
- Насколько структурированные данные могут быть сформированы
- Numpy структурированный массив – создание, назначение данных и выполнение операций
- Создание структурированного DataType (DTYPE)
- Распределение памяти для структурированных массивов
- Рекордные массивы – как это связано с структурированными массивами
- Понимание требований пакета Pandas
Структурированные массивы – это специальные формы Numpy массивы Отказ Они хранят соединения и гетерогенные данные, в отличие от нормальных примесей, которые хранят однородные данные. Вы можете создать структурированный массив, например, со следующей командой: np.dtype ({'names':( 'person_names', 'person_ages', 'is_python_programmer'), 'formats': ('u9', 'i8', "bool ')})
Отказ Этот структурированный массив будет иметь три столбца с тремя различными типорами данных, как определено в корза.
Мы обсудим Numpy структурированные массивы в полной мере. Они образуют позвоночник для PandaS DataFrame. Эта статья дает вам прочную основу для пакета Pandas.
Почему структурированные массивы?
Давайте представим сценарий, в котором у нас есть планета, в которой сейчас существует только 4 человека. Информация, которую мы знаем о них, это их имена, возраст, а также ли они программисты Python. Наивный способ хранения этих данных является использованием списков.
>>> person_names = ['Alice', 'Chris', 'Bob', 'Priyatham'] >>> person_ages = [42, 29, 42, 25] >>> is_python_programmer = [False, True, False, True]
Алиса и Боб – это персонажи, изобретенные в исследовательском документе о криптографии в 1978 году. Они стали очень известны в криптографии и компьютерном пространстве. Крис является основателем Finxter и я приятам.
Но если вы наблюдаете, нет ничего, что говорит о том, что существует связь между всеми тремя списками. Когда вы больше медитируете на эту мысль, вы можете прибыть на колени списка списков в качестве решения.
Давайте составьте всю информацию отдельных лиц в отдельных списках. При связывании их все снова в отдельном списке, у нас есть,
>>> Alice_info = ['Alice', 42, False] >>> Chris_info = ['Chris', 29, True] >>> Bob_info = ['Bob', 42, False] >>> Priyatham_info = ['Priyatham', 25, True] >>> planet_info = [Alice_info, Chris_info, Bob_info, Priyatham_info] >>> planet_info [['Alice', 42, False], ['Chris', 29, True], ['Bob', 42, False], ['Priyatham', 25, True]]
Вышеуказанное назначение списка может быть визуализировано следующим образом,
Вы можете видеть, что внутренние отдельные списки хранятся в разных местах памяти. Если мы хотим получить доступ к всем именам людей, которые находятся на нашей планете, мы должны зацикливаться через все списки. Это очень дорогостоящий процесс, потому что нам нужно прыгать через разные места памяти.
Numpy структурированный массив может хранить и сделать одни и те же данные доступными очень эффективными. Это делает это, хранение полного массива в то же местоположение памяти в смежном массиве. NUMPY использует API языка C за кулисами, которые заставляют его пылать.
Как построить и назначать данные для Numpy структурированные массивы
Давайте сначала построим нормальные номера Numpy, как наивные списки и расследовать их.
>>> import numpy as np >>> person_names_arr = np.array(person_names) >>> person_ages_arr = np.array(person_ages) >>> is_python_prog_arr = np.array(is_python_programmer) >>> person_names_arr array(['Alice', 'Chris', 'Bob', 'Priyatham'], dtype='>> person_ages_arr array([42, 29, 42, 25]) >>> is_python_prog_arr array([False, True, False, True])
Numpy массивы в основном характеризуются их типами данных. Мы можем получить доступ к типу данных, используя dtype
Атрибут объекта Numpy Array.
>>> person_names_arr.dtype dtype('>> person_ages_arr.dtype dtype('int64') >>> is_python_prog_arr.dtype dtype('bool')
Вы можете увидеть выше, что каждый массив знает, что это явная информация типа и имеет только один тип.
Numpy структурированный массив Создан с использованием специального типа данных ( dtype
), называемый структурированным типом данных. Структурированный тип данных может иметь несколько типов с назначенными им имена соответственно.
Создать Numpy структурированный массив с использованием структурированного типа данных. Мы можем ссылаться на вышеуказанные типы для создания типов данных в массиве.
>>> struct_arr = np.zeros(4, dtype = [('person_names', 'U9'), ('person_ages', 'i8'), ('is_python_programmer', 'bool')]) >>> struct_arr array([('', 0, False), ('', 0, False), ('', 0, False), ('', 0, False)], dtype=[('person_names', '
Вышеуказанное создано пустой Структурированный массив можно интерпретировать и визуализироваться как,
Мы можем использовать либо индексы ряд или столбцов, чтобы назначить информацию нашего народа на вышеупомянутый структурированный массив.
1. Назначение с использованием индексов столбцов:
>>> struct_arr['person_names'] = person_names >>> struct_arr['person_ages'] = person_ages >>> struct_arr['is_python_programmer'] = is_python_programmer >>> struct_arr array([('Alice', 42, False), ('Chris', 29, True), ('Bob', 42, False), ('Priyatham', 25, True)], dtype=[('person_names', '
2. Назначение с использованием индексов строки:
>>> struct_arr[0] = tuple(Alice_info) >>> struct_arr[1] = tuple(Chris_info) >>> struct_arr[2] = tuple(Bob_info) >>> struct_arr[3] = tuple(Priyatham_info) >>> struct_arr array([('Alice', 42, False), ('Chris', 29, True), ('Bob', 42, False), ('Priyatham', 25, True)], dtype=[('person_names', '
После любого из двух способов назначения структурированные массивы заполняются нашей информацией. Это можно интерпретировать и визуализироваться как,
Доступ к данным и операции по структурированным массивам
Теперь мы можем получить доступ к любому элементу, который присутствует в любом месте в массиве очень эффективно. Мы получаем дополнительное преимущество структурированного типа данных вместе с обычными функциями Numpy Armay, такие как агрегации, вещание и т. Д. Очень же столбец и индексы строки, которые мы использовали для назначения данных, можно использовать для доступа к элементам в массиве.
Чтобы получить все имена всех людей, присутствующих на нашей планете,
>>> struct_arr['person_names'] array(['Alice', 'Chris', 'Bob', 'Priyatham'], dtype='
Получить информацию, представленную в первом и втором рядах в массиве,
>>> struct_arr[0] ('Alice', 42, False) >>> struct_arr[1] ('Chris', 29, True)
Чтобы получить одинаковую информацию, мы можем использовать numpy. Где ()
функция. Для этого нам нужно точно знать имя человека, о котором мы хотим получить информацию. Это использует Numpy Boolean Masking внутри.
>>> struct_arr[np.where(struct_arr['person_names'] == 'Alice')] array([('Alice', 42, False)], dtype=[('person_names', '>> struct_arr[np.where(struct_arr['person_names'] == 'Chris')] array([('Chris', 29, True)], dtype=[('person_names', '
Чтобы получить имена последних 2 человек, можно использовать отрицательный индекс Python наряду с выделением структурированных массивов.
>>> struct_arr[-2:]['person_names'] array(['Bob', 'Priyatham'], dtype='
Чтобы получить имена программистов Python на нашей планете, мы снова используем булевую маскирующую,
>>> struct_arr[struct_arr['is_python_programmer']]['person_names'] array(['Chris', 'Priyatham'], dtype='
Мы можем видеть сверху, что Python Programmers менее возрастают, чем другие на нашей планете. Итак, давайте получим максимальный возраст программистов Python и минимальный возраст негазированных программистов. Тогда мы можем получить средний возраст, используя, как мы можем прокомментировать эволюцию языка программирования Python на нашей планете.
>>> python_prog_max_age = np.max(struct_arr[struct_arr['is_python_programmer']]['person_ages']) >>> non_python_prog_min_age = np.min(struct_arr[struct_arr['is_python_programmer'] == False]['person_ages']) >>> python_prog_max_age 29 >>> non_python_prog_min_age 42 >>> separation_age = int((python_prog_max_age + non_python_prog_min_age)/2) >>> separation_age 35
Будем говорить, что есть некоторые другие люди, которых мы не знаем, существовали на нашей планете. Но, исходя из данных, которые у нас есть, до 35 лет со сейчас на нашей планете не было или немногие программисты Python не существовали. Язык программирования Python недавно стал популярным среди молодых людей.
Если вы хотите сделать более сложные и сложные операции по таким данным, рассмотрите выпуск на пакет Pandas.
Структурированные типы данных – структурированные массивы
Посмотрите на строки типа протокола массива (‘u9’, ‘i8’, ‘?’) В вышеуказанном структурированном массиве. Первый символ относится к типу данных, а в следующем указывается количество байтов на каждый элемент этого типа. Unicode (‘u9’) и логический (‘?’) Являются исключениями. В типе строки Unicode следующий номер указывает количество максимальных символов, но не байтов. Логические значения (истинные и ложные) – это возможные результаты вопросов да/нет. Поскольку это вопрос, Numpy Core Developers может дать «?» как строка типа для логических ценностей (только моя мысль).
Все возможные типовые строки, используемые для создания примесовых массивов, как предусмотрено документацией;
Персонаж | Описание | Пример |
‘?’ | Логический | np.dtype (‘?’) |
‘b’ | Подписанный байт | np.dtype (‘b’) |
‘B’ | Беззнанный байт | np.dtype (‘b’) |
‘i’ | Подписано целое число | np.dtype (‘i8’) |
‘u’ | Unsigned целое число | np.dtype (‘u4’) |
‘f’ | Плавающая запятая | np.dtype (‘f2’) |
‘c’ | Комплексная плавающая точка | np.dtype (‘C16’) |
‘m’ | TimEdelta | np.dtype (‘m8’) |
‘M’ | DateTime. | np.dtype (‘m’) |
‘O’ | Объекты Python | np.dtype (‘O’) |
‘S’, ‘a’ | Строка (завершена нулю) | np.dtype (‘S5’) |
‘U’ | Строка Unicode | np.dtype (‘u’) |
‘V’ | Необработанные данные (пустота) | np.dtype (‘V’) |
Для других способов построения объектов типа данных вместо строки типа протокола массива, пожалуйста, обратитесь к этой документации ссылка Отказ
Три основных способа создания структурированных типов данных
Numpy предоставляет numpy.dtype
Функция для создания объектов типа данных. Мы можем ссылаться на вышеуказанные типы для создания типов данных. Существует 2 основных способа создания структурированных типов данных;
1. Используя словарь с именами и форматами в качестве клавиш (заголовки)
>>> dt_dict = np.dtype({'names':('person_names', 'person_ages', 'is_python_programmer'), ... 'formats': ('U9', 'i8', 'bool')}) >>> dt_dict dtype([('person_names', '
Значение ключа имен представляет собой кортеж индексов столбцов, которые мы используем в структурированном массиве. Значение ключа форматов представляет собой кортеж типовых строк для колонн соответственно.
>>> dt_dict.names ('person_names', 'person_ages', 'is_python_programmer') >>> dt_dict.fields mappingproxy({'person_names': (dtype('>> dt_dict.itemsize 45 >>> struct_arr.itemsize 45
Предмет в нашем структурированном массиве – это информация о одном человеке на нашей планете. Память, выделенная для одного элемента, составляет 45 байтов, как описано из атрибута элементов.
Если вы соблюдаете результат dt_dict.fields, вы можете увидеть распределение памяти байтов и распределение памяти по индексам. Мы знаем строку типа Все это объяснение может быть визуализировано с использованием ниже. 2. Использование Список кортежей В этом методе создается структурированный тип данных, используя список кортежей. Каждый кортеж состоит из имени индекса и его типа. Результат 3. Используя строку типов разделенных запятую Когда мы не заботимся о именах поля, мы можем использовать этот тип структурированного типа данных. Он автоматически выделяет некоторые имена поля «F0», «F1», «F2» …. на основе количества типов присутствующих. Рекордные массивы в основном структурированные массивы с одной дополнительной функциональностью. Предоставляется доступа к именованному поле индекса в качестве атрибута вместе с ключами словаря. Самый простой способ создания массивов записи – это использование Недостатком массива записи является то, что он медленнее, чем структурированный массив из-за его дополнительной функции. Структурированные массивы – это усилия разработчиков Nampy, чтобы иметь возможность иметь возможность иметь возможность справиться со структурированными данными. Но при работе с структурированными данными в виде таблиц возможны мир дополнительных операций. Пандас – очень зрелый инструмент для решения всех таких операций. Пожалуйста, рассмотрите прыжок в сторону пакета Pandas, если вы имеете дело с любыми такими структурированными данными, обсуждаемыми в статье.>>> dt_tupl = np.dtype([('person_names', '
dt_tupl.names
Приходит к выводу, что имена индекса будут созданы от кортежей автоматически.>>> dt_str = np.dtype('U9, i8, bool')
>>> dt_str
dtype([('f0', '
Рекордные массивы
>>> rec_arr = np.rec.array(struct_arr)
>>> rec_arr['person_names']
array(['Alice', 'Chris', 'Bob', 'Priyatham'], dtype='
numpy.rec.array ()
функция. Поле Person_Names доступно в качестве атрибута вместе с индексом на основе ключей словаря выше. Массив записи принимает структурированный массив и создает другой разный объект из структурированного массива. Результат rec_arr
доказывает, что они обоим имеют одинаковые значения с его дополнительной функцией.Следующие шаги: выпуск на пандах