Python урок 8. матрицы (двумерный массив)
Содержание:
- How to insert elements?
- Вычислительные методы NumPy
- Массивы NumPy (Ndarray)
- Реверсив Numpy Array в Python
- Изменение размеров и транспонирование массива в Python
- Перестройка массива
- Создание массивов в Python по диапазонам
- Объявление объекта Bitarray:
- Операции с матрицами
- Разница между массивом и списком
- Функции, доступные в Python Bitarray:
- Reversing an Array of Array Module in Python
- Трансляция с помощью numpy.where()
- Массив нарезки
- Вопрос 10. Как объединить два списка в список кортежей?
How to insert elements?
Python array insert operation enables you to insert one or more items into an array at the beginning, end, or any given index of the array. This method expects two arguments index and value.
The syntax is
arrayName.insert(index, value)
Example:
Let’s add a new value right after the second item of the array. Currently, our balance array has three items 300, 200, and 100. Consider the second array item with a value of 200 and index 1.
In order to insert the new value right “after” index 1, you need to reference index 2 in your insert method, as shown in the below Python array example:
import array balance = array.array('i', ) balance.insert(2, 150) print(balance)
Output:
array('i', )
Example 2:
import array as myarr a=myarr.array('b',) a.insert(2,56) print(a)
Output:
array('b', )
Вычислительные методы NumPy
При помощи различных методов мы можем проводить арифметические операции внутри коллекций, вычислить сумму всех элементов или найти наибольше значение. Приведем пример основных методов:
>>> import numpy as np
>>> grades = np.array(, , ])
>>> gradesarray(,
,
])
>>> grades.min()2
>>> grades.max()5
>>> grades.sum()51
>>> grades.mean()4.25
>>> grades.std()0.924211375534118
>>> grades.var()0.8541666666666666
Метод min() и max() находит наименьшее и наибольшее значение. Метод sum() — вычисляет сумму всех элементов, mean() — математическое ожидание, std() — стандартное отклонение, var() — дисперсию.
Эти методы могут применяться к конкретным осям array. К примеру, нам нужно вычислить средний бал по предмету. Для это в метод добавляется аргумент axis, который позволяет проводить вычисление по строкам или столбцам.
>>> grades.mean(axis=0)array()
>>> grades.mean(axis=1)array()
Если axis=0, выполняется вычисления по всем значениям строк внутри каждого столбца.
Если axis=1, выполняется вычисления со всеми значениями столбца внутри каждой отдельной строки.
Массивы NumPy (Ndarray)
Создание
Для использования класса Ndarray предварительно необходимо импортировать библиотеку numpy:
import numpy as np
Для создания массива используется функция модуля numpy — array():
import numpy as np new_array = np.array()
В первый параметр функции array() передаётся список, поэтому способов создания столько же, сколько способов создания списков. При передаче в параметр многомерного списка будет создан многомерный массив:
import numpy as np new_array = np.array(, , ])
Тип значения элементов
В данном примере элементы массива были приведены к строковому типу, так как каждый список главного списка содержал строковое значение. Тип значения элементов массива можно переопределять при создании массива, указывая его вторым параметром функции array():
import numpy as np new_array = np.array(, , ], dtype=np.str)
Атрибуты класса Ndarray
Далее рассмотрим атрибуты класса Ndarray:
- ndim — число измерений (осей) массива;
- shape — размерность массива. Это tuple, содержащий натуральные числа (n, m) — длины массива по каждой оси (n — высота, m — ширина). Число элементов кортежа shape равно ndim.
- size — количество элементов в массиве, равно произведению всех элементов атрибута shape;
- dtype — тип элементов массива. NumPy предоставляет возможность использовать как встроенные типы, например: bool_, character, int8, int16, int32, int64, float8, float16, float32, float64, complex64, object_, так и собственные типы данных, в том числе и составные;
- itemsize — размер каждого элемента массива в байтах;
- data — буфер, содержащий фактические элементы массива. Обычно не нужно использовать этот атрибут, так как обращаться к элементам массива проще всего с помощью индексов.
Изменение размерности
Размерность массива darray в Python можно изменять методом reshape():
import numpy as np new_array = np.array(, , ], dtype=np.str) new_array.reshape(2, 3)
При этом количество элементов должно позволять это сделать, т.е. произведение элементов атрибута shape до и после изменения размера должно быть одинаковым. К примеру, нельзя изменить размерность массива с (3, 4) на (2, 5), но можно изменить её на (2, 6).
Реверсив Numpy Array в Python
Модуль позволяет нам использовать массив Структуры данных в Python, которые действительно быстро И разрешить только такие же массивы типа данных.
Здесь мы собираемся обратить вспять массив в Python, построенный с помощью Numpy Module.
1. Использование метода FLIP ()
Метод в модуле Numpy переворачивает порядок Numpy Array и возвращает объект Numpy Array.
import numpy as np #The original NumPy array new_arr=np.array() print("Original Array is :",new_arr) #reversing using flip() Method res_arr=np.flip(new_arr) print("Resultant Reversed Array:",res_arr)
Выход :
Original Array is : Resultant Reversed Array:
2. Использование метода flipud ()
метод еще один метод в Numpy Модуль, который переворачивает массив вверх/вниз. Он также может быть использован, чтобы изменить номерного массива в Python. Давайте посмотрим, как мы можем использовать его в небольшом примере.
import numpy as np #The original NumPy array new_arr=np.array() print("Original Array is :",new_arr) #reversing using flipud() Method res_arr=np.flipud(new_arr) print("Resultant Reversed Array:",res_arr)
Выход :
Original Array is : Resultant Reversed Array:
3. Используя простые нарезки
Как мы делали ранее со списками, мы можем поменять массив в Python, построенный с Numpy, используя нарезка Отказ Мы создаем новый Numpy объект массива, который содержит элементы в обратном порядке.
import numpy as np #The original NumPy array new_arr=np.array() print("Original Array is :",new_arr) #reversing using array slicing res_arr=new_arr print("Resultant Reversed Array:",res_arr)
Выход :
Original Array is : Resultant Reversed Array:
Изменение размеров и транспонирование массива в Python
В NumPy существует много возможностей для изменения размера массивов.
8.1. Метод resize
Метод resize изменяет размер исходной коллекции array:
>>> import numpy as np
>>> numbers = np.array()
>>> numbersarray()
>>> numbers.resize(3, 2)
>>> numbersarray(,
,
])
8.2. Методы flatten и ravel
Метод flatten выполняет глубокое копирование данных исходной коллекции
>>> import numpy as np
>>> numbers = np.array()
>>> numbers_fl = numbers.flatten()
>>> numbers_flarray()
Чтобы проверить что numbers и numbers_fl не используют общие данные изменим элемент numbers_fl и выведем оба массива:
>>> numbers_fl[] = 77
>>> numbers_flarray()
>>> numbersarray()
Значение в numbers_fl изменилось, значит массивы уже не связаны между собой.
метод ravel создает представление (поверхностную копию) исходной коллекции array, которое использует общие данные.
>>> numbersarray()
>>> numbers_ra = numbers.ravel()
>>> numbers_raarray()
Чтобы проверить использование общих данных, изменим один элемент numbers_ra:
>>> numbers_ra[] =125
>>> numbers_raarray()
>>> numbersarray()
В результате значения поменялись в обоих массивах.
8.3. Транспонирование строк и столбцов
С помощью атрибута T вы можете быстро транспонировать строки и столбцы маcсива, то есть сделать так чтобы строки стали столбцами, а столбцы строками.
>>> import numpy as np
>>> numbers = np.array(, ])
>>> numbersarray(,
])
>>> numbers.Tarray(,
,
])
Транспонирование не изменяет исходную коллекцию array.
8.4. Горизонтальное и вертикальное дополнение. Функции hstack и vstack
Добавление новых строк или столбцов, называется горизонтальным или вертикальным дополнением. Допустим у нас есть две коллекции array, и мы хотим объединить их в одну. Для этого можно воспользоваться функцией hstack() из библиотеки NumPy. Функцие hstack() передается кортеж с объединяемыми коллекциями:
>>> import numpy as np
>>> numbers_1 = np.array()
>>> numbers_2 = np.array()
>>> np.hstack((numbers_1, numbers_2))array()
В случае если нам требуется объединить массивы добавлением, можно воспользоваться функцией vstack():
>>> np.vstack((numbers_1, numbers_2))array(,
])
Please enable JavaScript to view the comments powered by Disqus.
Перестройка массива
После нарезки данных вам может понадобиться изменить их.
Например, некоторые библиотеки, такие как scikit-learn, могут требовать, чтобы одномерный массив выходных переменных (y) был сформирован как двумерный массив с одним столбцом и результатами для каждого столбца.
Некоторые алгоритмы, такие как рекуррентная нейронная сеть с короткой кратковременной памятью в Keras, требуют ввода данных в виде трехмерного массива, состоящего из выборок, временных шагов и функций.
Важно знать, как изменить ваши массивы NumPy, чтобы ваши данные соответствовали ожиданиям конкретных библиотек Python. Мы рассмотрим эти два примера
Форма данных
Массивы NumPy имеют атрибут shape, который возвращает кортеж длины каждого измерения массива.
Например:
При выполнении примера печатается кортеж для одного измерения.
Кортеж с двумя длинами возвращается для двумерного массива.
Выполнение примера возвращает кортеж с количеством строк и столбцов.
Вы можете использовать размер измерений вашего массива в измерении формы, например, указав параметры.
К элементам кортежа можно обращаться точно так же, как к массиву, с 0-м индексом для числа строк и 1-м индексом для количества столбцов. Например:
Запуск примера позволяет получить доступ к конкретному размеру каждого измерения.
Изменить форму 1D в 2D Array
Обычно требуется преобразовать одномерный массив в двумерный массив с одним столбцом и несколькими массивами.
NumPy предоставляет функцию reshape () для объекта массива NumPy, который можно использовать для изменения формы данных.
Функция reshape () принимает единственный аргумент, который задает новую форму массива. В случае преобразования одномерного массива в двумерный массив с одним столбцом кортеж будет иметь форму массива в качестве первого измерения (data.shape ) и 1 для второго измерения.
Собрав все это вместе, мы получим следующий проработанный пример.
При выполнении примера печатается форма одномерного массива, изменяется массив, чтобы иметь 5 строк с 1 столбцом, а затем печатается эта новая форма.
Изменить форму 2D в 3D Array
Обычно требуется преобразовать двумерные данные, где каждая строка представляет последовательность в трехмерный массив для алгоритмов, которые ожидают множество выборок за один или несколько временных шагов и одну или несколько функций.
Хорошим примером являетсямодель в библиотеке глубокого обучения Keras.
Функция изменения формы может использоваться напрямую, указывая новую размерность. Это ясно с примером, где каждая последовательность имеет несколько временных шагов с одним наблюдением (функцией) на каждый временной шаг.
Мы можем использовать размеры в атрибуте shape в массиве, чтобы указать количество выборок (строк) и столбцов (временных шагов) и зафиксировать количество объектов в 1
Собрав все это вместе, мы получим следующий проработанный пример.
При выполнении примера сначала печатается размер каждого измерения в двумерном массиве, изменяется форма массива, а затем суммируется форма нового трехмерного массива.
Создание массивов в Python по диапазонам
NumPy представляет множество функций для создания массивов в заданном диапазоне. Разберем самые распространённые.
3.1. Создание диапазонов функцией arange
В библиотеке NumPy существует функция arange для создания целочисленных диапазонов, аналогичной встроенной функции range в Python.
>>> import numpy as np
>>> np.arange(7)array()
>>> np.arange(5, 10)array()
>>> np.arange(100, 10, -10)array()
При создании коллекций array вы можете воспользоваться встроенной функции Python range, но рекомендуется использовать именно arange, так как она оптимизирована для array. Все свойства arange аналогичны функции range.
3.2. Создание диапазонов чисел с плавающей точкой функцией linspace
Для создания диапазонов чисел с плавающей точкой можно воспользоваться функцикй limspace библиотеки NumPy.
>>> import numpy as np
>>> np.linspace(1.0, 2.0, num=5)array()
>>> np.linspace(1.0, 5.0, num=10)array()
В функции linspace первые два аргумента определяют начальное и конечное значение диапазона
Важно: конечное значение включается в array. Ключевой аргумент num необязательный. Он задает количество равномерно распределенных генерируемых значений
По умолчанию num = 50.
3.3. Изменение размерности array методом reshape
Методом reshape вы можете преобразовать одномерную коллекцию в многомерную. В примере создадим коллекцию array с помощью со значениями от 1 до 36 и с помощью метода reshape преобразуем ее в структуру из 6 строк и 6 столбцов.
>>> import numpy as np
>>> np.(1, 37).reshape(6, 6)array(,
,
,
,
,
])
>>> np.(1, 37).reshape(4, 9)array(,
,
,
])
Во втором примере мы преобразовали в структуру 4 строк и 9 столбцов.
Размерность можно изменять для любой коллекции array, но при условии, что количество новой версии не будет отличаться от оригинала. Например, коллекцию из шести элементов, можно преобразовать в коллекцию 3*2 или 2*3. В нашем примере мы преобразовали коллекцию из 36 элементов в коллекцию 6*6 и 4*9. В случае неправильного преобразования, вы получите ошибку ValueError.
3.4. Заполнение array конкретными значениями. Функции zeros, ones, full
Функция zeros создает коллекцию содержащие 0. Первым аргументом должно быть целое число или кортеж целых чисел.
>>> import numpy as np
>>> np.zeros(7)array()
>>> np.zeros((3, 3))array(,
,
])
Функция ones создает коллекцию содержащие 1.
>>> import numpy as np
>>> np.ones((3, 3))array(,
,
])
По умолчанию функции zeros и ones создают коллекции array, содержащие значения float. Для изменения типа значения можно задать аргумент dtype:
>>> import numpy as np
>>> np.ones((3, 3), dtype=int)array(,
,
])
>>> np.zeros((3, 3), dtype=int)array(,
,
])
Функция full, возвращает элементы со значением и типом второго аргумента:
>>> import numpy as np
>>> np.full((3, 4), 55)array(,
,
])
>>> np.full((2, 4), 21.2)array(,
])
3.5. Вывод больших коллекций array
При выводе больших коллекций array, NumPy исключает из вывода все строки и столбцы кроме первых трех и последних. Вместо исключенных данных проставляется знак многоточие.
>>> import numpy as np
>>> np.(1, 100001).(100, 1000)array(,
,
,
…,
,
,
])
Объявление объекта Bitarray:
1) Пустой объект python bitarray
from bitarray import bitarray() arr.append(False) arr.append(True) arr
- Во-первых, мы импортировали модуль битового массива
- Затем мы объявили пустой объект массива байтов arr
- Затем мы добавили логические значения False и True к объекту arr
- Это один из способов объявления объекта битового массива
Выход:
Объявление пустого объекта битового массива
2) Объявление пустого объекта bitarray заданного размера:
(2**5)
Это создает пустой объект битового массива размером 32
3) Объявление битового массива с помощью строки:
bitarray('11011011')
Это создает объект битового массива со значением 11011011
4)Объявление объекта bitarray со списком/кортежем:
lst = bitarray(lst)
Это создает объект битового массива со значением 100010
5)Разное:
Помимо всего этого, бит может быть назначен из любого объекта python, учитывая, что значение может быть интерпретировано как True или False.
([41,>
инициализация битового массива случайными объектами python
Здесь пустые значения интерпретируются как Ложные, а другие-как Истинные
Операции с матрицами
Выше мы привели пример сложение, умножение матриц и транспонирование матрицы. Мы использовали вложенные списки, прежде чем создавать эти программы. Рассмотрим, как выполнить ту же задачу, используя массив NumPy.
Сложение двух матриц или сумма элементов массива Python
Мы используем оператор +, чтобы сложить соответствующие элементы двух матриц NumPy.
import numpy as np A = np.array(, ]) B = np.array(, ]) C = A + B # сложение соответствующих элементов print(C) ''' Вывод: ] '''
Умножение двух матриц Python
Чтобы умножить две матрицы, мы используем метод dot(). Узнайте больше о том, как работает numpy.dot .
Примечание: * используется для умножения массива (умножения соответствующих элементов двух массивов), а не умножения матрицы.
import numpy as np A = np.array(, ]) B = np.array(, , ]) C = a.dot(B) print(C) ''' Вывод: ] '''
Транспонирование матрицы питон
Мы используем numpy.transpose для вычисления транспонирования матрицы.
import numpy as np A = np.array(, , ]) print(A.transpose()) ''' Вывод: ] '''
Как видите, NumPy значительно упростил нашу задачу.
Разница между массивом и списком
Здесь мы обсудим различия между массивом и списком.
Список | Массив | |
---|---|---|
1. | В списке могут храниться значения разных типов. | Он может состоять только из значений одного типа. |
2. | Список не может обрабатывать прямые арифметические операции. | Массив может напрямую обрабатывать арифметические операции. |
3. | Списки представляют собой встроенную структуру данных, поэтому нам не нужно их импортировать. | Перед работой с массивом нам необходимо импортировать его модуль. |
4. | Списки менее совместимы, чем массивы для хранения данных. | Массивы более совместимы, чем список. |
5. | Он потребляет большой объем памяти. | Это более компактный по объему памяти по сравнению со списком. |
6. | Подходит для хранения более длинной последовательности элементов данных. | Подходит для хранения более короткой последовательности элементов данных. |
7. | Мы можем распечатать весь список, используя явный цикл. | Мы можем распечатать весь список без использования явного цикла. |
8. | Он может быть вложенным, чтобы содержать различные типы элементов. | Он может содержать любые вложенные элементы одинакового размера. |
Мы обсудили различия между массивом и списком. Оба типа данных важны в Python, и у обоих есть некоторые ограничения. Массивы обычно используются для анализа данных.
Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Функции, доступные в Python Bitarray:
Сл Нет | Функция | Описание | Тип возврата |
1 | все() | True, когда все биты в массиве истинны | тип bool |
2 | какой-нибудь() | True, когда любой бит в массиве истинен | тип bool |
3 | добавить(пункт, /) | Добавьте значение истинности bool(item) в конец битового массива | – |
4 | bytereverse() | Реверсирует порядок битов на месте | – |
5 | понятно() | Опустошает битовый массив | – |
6 | копировать() | Копирует битовый массив | битаррей |
7 | Подсчитывает частоту значения bool | инт | |
8 | extend(iterable или string, /) | Расширяет битовый массив | – |
9 | заполнять() | Добавляет 0s в конец bitarray, чтобы сделать его кратным 8 | инт |
10 | индекс(значение,, stop=, /) | Находит индекс первого вхождения заданного значения bool | инт |
11 | вставить(индекс, значение, /) | Вставляет значение bool в заданный индекс | – |
12 | инвертировать(индекс=) | Инвертирует все биты на месте | – |
13 | intersearch(bitarray, /) | Поиск заданного битового массива | итератор |
14 | длина() | Дает длину битового массива | инт |
15 | pop(индекс=-1, /) | Удаляет и возвращает i-й элемент | пункт |
16 | удалить(значение, /) | Удалите первое вхождение заданного значения bool | – |
17 | обратный() | Изменяет порядок битов на месте | – |
18 | Сортирует биты по местам |
Функции, доступные для объекта bitarray
Reversing an Array of Array Module in Python
Even though Python doesn’t support arrays, we can use the Array module to create array-like objects of different data types. Though this module enforces a lot of restrictions when it comes to the array’s data type, it is widely used to work with array data structures in Python.
Now, let us see how we can reverse an array in Python created with the Array module.
1. Using reverse() Method
Similar to lists, the method can also be used to directly reverse an array in Python of the Array module. It reverses an array at its original location, hence doesn’t require extra space for storing the results.
import array #The original array new_arr=array.array('i',) print("Original Array is :",new_arr) #reversing using reverse() new_arr.reverse() print("Reversed Array:",new_arr)
Output:
Original Array is : array('i', ) Resultant new reversed Array: array('i', )
2. Using reversed() Method
Again, the method when passed with an array, returns an iterable with elements in reverse order. Look at the example below, it shows how we can reverse an array using this method.
import array #The original array new_arr=array.array('i',) print("Original Array is :",new_arr) #reversing using reversed() res_arr=array.array('i',reversed(new_arr)) print("Resultant Reversed Array:",res_arr)
Output:
Original Array is : array('i', ) Resultant Reversed Array: array('i', )
Трансляция с помощью numpy.where()
Если мы предоставим все массивы condition, x и y, numpy будет транслировать их вместе.
import numpy as np a = np.arange(12).reshape(3, 4) b = np.arange(4).reshape(1, 4) print(a) print(b) # Broadcasts (a < 5, a, and b * 10) # of shape (3, 4), (3, 4) and (1, 4) c = np.where(a < 5, a, b * 10) print(c)
Вывод
] `0 1 2 3` ]
Опять же, здесь вывод выбирается на основе условия, поэтому все элементы, но здесь b, транслируются в форму a. (Одно из его измерений имеет только один элемент, поэтому при трансляции ошибок не будет).
Итак, b теперь станет ], и теперь мы можем выбирать элементы даже из этого транслируемого массива. Таким образом, форма вывода такая же, как у файла.
Массив нарезки
Все идет нормально; Создание и индексация массивов выглядит знакомо.
Теперь мы подошли к нарезке массивов, и это одна из функций, которая создает проблемы для начинающих массивов Python и NumPy.
Структуры, такие как списки и массивы NumPy, могут быть нарезаны. Это означает, что подпоследовательность структуры может быть проиндексирована и извлечена.
Это наиболее полезно при машинном обучении при указании входных и выходных переменных или разделении обучающих строк из строк тестирования.
Нарезка задается с помощью оператора двоеточия ‘:’ с ‘от’ а также ‘в‘Индекс до и после столбца соответственно. Срез начинается от индекса «от» и заканчивается на один элемент перед индексом «до».
Давайте рассмотрим несколько примеров.
Одномерная нарезка
Вы можете получить доступ ко всем данным в измерении массива, указав срез «:» без индексов.
При выполнении примера печатаются все элементы в массиве.
Первый элемент массива можно разрезать, указав фрагмент, который начинается с индекса 0 и заканчивается индексом 1 (один элемент перед индексом «до»)
Выполнение примера возвращает подмассив с первым элементом.
Мы также можем использовать отрицательные индексы в срезах. Например, мы можем нарезать последние два элемента в списке, начав срез с -2 (второй последний элемент) и не указав индекс «до»; это берет ломтик до конца измерения.
Выполнение примера возвращает подмассив только с двумя последними элементами.
Двумерная нарезка
Давайте рассмотрим два примера двумерного среза, которые вы, скорее всего, будете использовать в машинном обучении.
Разделение функций ввода и вывода
Распространено загруженные данные на входные переменные (X) и выходную переменную (y).
Мы можем сделать это, разрезая все строки и все столбцы до, но перед последним столбцом, затем отдельно индексируя последний столбец.
Для входных объектов мы можем выбрать все строки и все столбцы, кроме последнего, указав ‘:’ в индексе строк и: -1 в индексе столбцов.
Для выходного столбца мы можем снова выбрать все строки, используя ‘:’, и индексировать только последний столбец, указав индекс -1.
Собрав все это вместе, мы можем разделить 3-колоночный 2D-набор данных на входные и выходные данные следующим образом:
При выполнении примера печатаются разделенные элементы X и y
Обратите внимание, что X — это двумерный массив, а y — это одномерный массив
Сплит поезд и тестовые ряды
Обычно загруженный набор данных разбивают на отдельные наборы поездов и тестов.
Это разделение строк, где некоторая часть будет использоваться для обучения модели, а оставшаяся часть будет использоваться для оценки мастерства обученной модели.
Для этого потребуется разрезать все столбцы, указав «:» во втором индексе измерения. Набор обучающих данных будет содержать все строки от начала до точки разделения.
Тестовым набором данных будут все строки, начиная с точки разделения до конца измерения.
Собрав все это вместе, мы можем разделить набор данных в надуманной точке разделения 2.
При выполнении примера выбираются первые две строки для обучения и последняя строка для набора тестов.
Вопрос 10. Как объединить два списка в список кортежей?
Сложность: (> ⌒ <)
Для объединения двух списков в список кортежей можно использовать функцию zip, причём не только для двух, но и для трёх и более списков. Это полезно для формирования, например, матриц из векторов.
В первых двух строчках мы создали два списка, которые надо объединить. В третьей с помощью конструкции, похожей на двойной генератор, создали список, состоящий из кортежей вида (k, v), где k и v берутся из двух наших списков с помощью функции zip(). К слову, она не зря носит такое название: в переводе zip означает «застёжка-молния», и эта функция как бы сшивает два списка в один.