Транспонирование матрицы (numpy массива) в python
Как оказалась с транспонирование такого вида матрицы проблем нет, a.transpose() выдает результат. C транспонированием одномерного вектора возникоют проблемы, т.е. такого вида a = np.array([[0, 1, 2]])
8 мар 2016 в 16:43
а какие проблемы с одномерным вектором? Попробовал, получается array([[1], [2], [3]]) .
8 мар 2016 в 16:47
результат получается все тот же 1х3, а не как мне хотелось бы 3х1,
8 мар 2016 в 16:47
[[1], [2], [3]] — это и есть 3×1 (три строки по одному элементу).
8 мар 2016 в 16:48
Кстати, раз уж сами нашли ответ по поводу транспонирования, добавьте его.
8 мар 2016 в 16:49
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Транспонирование массива в numpy выполняется так:
import numpy as np a = np.array([[0, 1, 2], [4, 5, 6]]) a = a.transpose() print(a)
[[0 4] [1 5] [2 6]]
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
ответ дан 8 мар 2016 в 16:50
303 3 3 золотых знака 5 5 серебряных знаков 13 13 бронзовых знаков
a.T транспонированный вид возвращает.
8 мар 2016 в 18:00
import numpy as np a = np.array([0, 1, 2], [4, 5, 6]) a = a.T
Отслеживать
ответ дан 14 сен 2018 в 9:06
31 1 1 бронзовый знак
пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править
14 сен 2018 в 9:16
def transpouse(mat): matrix = [] for i in range(len(mat[0])):# mat - изначальная матрица matrix.append(list()) for j in range(len(mat)): matrix[i].append(mat[j][i]) return matrix
Отслеживать
47.8k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
ответ дан 16 мар 2021 в 19:29
Рафаэль Габдуллин Рафаэль Габдуллин
16 мар 2021 в 19:35
В вопросе используется матрица в виде массива numpy. У массивов numpy уже есть методы транспонирования, в контексте данного вопроса использование ручного транспонирования через списки неоправданно.
17 мар 2021 в 8:03
Highly active question. Earn 10 reputation (not counting the association bonus) in order to answer this question. The reputation requirement helps protect this question from spam and non-answer activity.
- python
- numpy
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как правильно транспонировать матрицу
Как правильно сделать функцию из моего кода и чтобы она работала полностью? Код написал, но он не работает с некоторыми входными данными. А именно при нулях (строка = 0, колонка = 0) и при очень больших матрицах(в тестах валится на 950×764 матрице). Функцию, которую пытался написать и код — ниже. Помогите пожалуйста довести до ума. Условие: Есть матрица размера m × n. Нужно написать функцию, которая её транспонирует. Транспонированная матрица получается из исходной заменой строк на столбцы. Формат ввода: В первой строке задано число n — количество строк матрицы. Во второй строке задано m — число столбцов, m и n не превосходят 1000. В следующих n строках задана матрица. Числа в ней не превосходят по модулю 1000. Формат вывода: Напечатайте транспонированную матрицу в том же формате, который задан во входных данных. Каждая строка матрицы выводится на отдельной строке, элементы разделяются пробелами. Пример вводы/вывода: Ввод 4 3 1 2 3 0 2 6 7 4 1 2 7 0 Вывод 1 0 7 2 2 2 4 7 3 6 1 0 Просто код:
rows = int(input().strip()) colums = int(input().strip()) a = [[0]*colums for _ in range(rows)] for i in range(rows): a[i] = [int(j) for j in input().strip().split(" ")] rows_count = len(a) colums_count = len(a[0]) new_matrix = [[0] * rows_count for _ in range(colums_count)] for i in range(rows_count): for j in range(colums_count): new_matrix[j][i] = a[i][j] for row in new_matrix: print(*row)
Пытался создать функцию из кода выше, но безуспешно. Много ошибок:
def transpose(rows, colums): rows_count = len(a) colums_count = len(a[0]) new_matrix = [[0] * rows_count for _ in range(colums_count)] for i in range(rows_count): for j in range(colums_count): new_matrix[j][i] = a[i][j] for row in new_matrix: print(*row) if __name__ == '__main__': rows = int(input().strip()) colums = int(input().strip()) a = [[0] * colums for _ in range(rows)] for i in range(rows): a[i] = [int(j) for j in input().strip().split(" ")] print(transpose(rows, colums))
Правка после комментариев Sergey и A_Vaclav
def transpose(a): for i in range(rows): a[i] = [int(j) for j in input().strip().split(' ')] rows_count = len(a) colums_count = len(a[0]) new_matrix = [[0] * rows_count for _ in range(colums_count)] for i in range(rows_count): for j in range(colums_count): new_matrix[j][i] = a[i][j] for row in new_matrix: print(*row) if __name__ == '__main__': rows = int(input().strip()) colums = int(input().strip()) a = [colums for _ in range(rows)] print(transpose(a))
Результат работы функции: Ввод: 4 3 1 2 3 2 4 5 6 78 8 6 8 9 Вывод: 1 2 6 6 2 4 78 8 3 5 8 9 None Проверка случая, когда на вход подаются нули:
def transpose(a): rows_count = len(a) colums_count = len(a) if rows_count == colums_count == 0: print('None') new_matrix = [] for j in range(colums_count): tmp = [] for i in range(rows_count): tmp.append(a[i][j]) new_matrix.append(tmp) return new_matrix if __name__ == '__main__': rows = int(input().strip()) colums = int(input().strip()) a = [[0] * colums for _ in range(rows)] for i in range(rows): a[i] = [int(j) for j in input().strip().split(' ')] # print(transpose(a)) for row in transpose(a): if row != 0: print(*row)
Входные 0 0 Выходные None Входные: 4 5 4 5 6 7 8 5 6 7 7 8 6 7 8 8 9 8 9 6 4 3 Выходные: (выводит без последней колонки) 4 5 6 8 5 6 7 9 6 7 8 6 7 7 8 4 Если я делаю так colums_count = len(a[0]), то матрица транспонируется нормально, но при нулях ошибка! NoneType is not iterable. Пытался в конце под main() задать условие в цикле, что вывод только если row != 0, но это не помогло
Транспонирование и умножение матриц на Python
В этом уроке мы напишем программы на Python для транспонирования и умножения матриц и вывода результатов.
Прежде чем писать программу транспонирования матрицы на Python, давайте сначала посмотрим на обзор транспонирования.
Транспонирование матрицы
Если вы заменяете строки матрицы столбцом той же матрицы, это называется транспонированием матрицы. Обозначается как X’. Например: Элемент в i-й строке и j-м столбце в X будет помещен в j-ю строку и i-й столбец в X’.
Пример: Предположим, мы взяли следующую матрицу A:
A = [[5, 4, 3] [2, 4, 6] [4, 7, 9] [8, 1, 3]]
At будет транспонированием указанной выше матрицы, т. е. A [i] [j] = At [j] [i], и поэтому At должно быть:
В = [5, 2, 4, 8] [4, 4, 7, 1] [3, 6, 9, 3]
Программа Python для транспонирования матрицы
Теперь мы напишем программу на Python для транспонирования входной заданной матрицы, где мы выполняем операцию, как мы выполнили в приведенном выше примере. Чтобы выполнить операцию транспонирования матрицы, мы будем использовать метод вложенного цикла for.
Давайте разберемся с использованием и реализацией этого метода на следующем примере.
# Define a matrix A A = [[5, 4, 3], [2, 4, 6], [4, 7, 9], [8, 1, 3]] # Define an empty matrix of reverse order transResult = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] # Use nested for loop on matrix A for a in range(len(A)): for b in range(len(A[0])): transResult[b][a] = A[a][b] # store transpose result on empty matrix # Printing result in the output print("The transpose of matrix A is: ") for res in transResult: print(res)
The transpose of matrix A is: [5, 2, 4, 8] [4, 4, 7, 1] [3, 6, 9, 3]
Умножение матриц
В этом разделе мы напишем программу на Python для умножения двух входных матриц и выведем результат на выходе. Эта программа укажет, как умножать две матрицы, имеющие определенные значения.
Прежде чем писать программу на Python, давайте сначала посмотрим на обзор умножения двух матриц.
Умножение матриц — это бинарная операция, в которой используется пара матриц для создания другой матрицы. Элементы в матрице умножаются в соответствии с элементарной арифметикой.
При умножении двух матриц элементы строки первой матрицы умножаются на элементы столбца второй матрицы.
Пример: предположим, что мы взяли следующие две матрицы A и B:
A = [[5, 4, 3] [2, 4, 6] [4, 7, 9]] and, B = [[3, 2, 4] [4, 3, 6] [2, 7, 5]]
C будет объединением двух указанных выше матриц, т. е. C = A + B, и поэтому C должно быть:
C = [[37, 43, 59] [34, 58, 62] [58, 92, 103]]
Как мы видим, результирующая матрица C, также известная как произведение матриц, имеет то же количество строк, что и первая матрица (матрица A), и такое же количество столбцов, как и вторая матрица (матрица B). Мы также знаем этот тип умножения матриц как скалярное произведение матриц.
Умножение двух матриц
Теперь мы напишем программу Python для умножения двух матриц, где мы выполняем умножение, как мы это делали в приведенном выше примере. Мы можем использовать различные методы для написания такой программы на Python, но в этом руководстве будем использовать только следующие два метода:
- Использование метода вложенного цикла.
- Использование метода понимания вложенного списка.
В обоих методах мы напишем пример программы, чтобы понять их реализацию для умножения двух матриц.
Способ 1: Использование метода вложенного цикла
В этом методе мы собираемся использовать вложенный цикл for для двух матриц, выполнять над ними умножение и сохранять результат умножения в третьей матрице в качестве итогового значения.
Давайте разберемся с реализацией этого метода на следующем примере.
# Define two matrix A and B in program A = [[5, 4, 3], [2, 4, 6], [4, 7, 9]] B = [[3, 2, 4], [4, 3, 6], [2, 7, 5]] # Define an empty matrix to store multiplication result multiResult = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] # Using nested for loop method on A & B matrix for m in range(len(A)): for n in range(len(B[0])): for o in range(len(B)): multiResult[m][n] += A[m][o] * B[o][n] # Storing multiplication result in empty matrix # Printing multiplication result in the output print("The multiplication result of matrix A and B is: ") for res in multiResult: print(res)
The multiplication result of matrix A and B is: [37, 43, 59] [34, 58, 62] [58, 92, 103]
Способ 2: Использование метода понимания вложенного списка
В этом методе мы будем использовать понимание вложенного списка, чтобы получить результат умножения двух входных матриц. При использовании в программе метода понимания списка мы также будем использовать «zip в Python» для вложенного списка. Давайте разберемся с реализацией этого метода на следующем примере.
# Define two matrix A & B in the program A = [[5, 4, 3], [2, 4, 6], [4, 7, 9]] B = [[3, 2, 4], [4, 3, 6], [2, 7, 5]] # Using nested list method with zip in Python multiResult = [[sum(a * b for a, b in zip(Arow, Bcol)) for Bcol in zip(*B)] for Arow in A] # Printing multiplication result in the output print("The multiplication result of matrix A and B is: ") for res in multiResult: print(res)
The multiplication result of matrix A and B is: [37, 43, 59] [34, 58, 62] [58, 92, 103]
Преобразование матрицы в Python
Необходимо создать массив данных несущих в себе информацию о значениях отличных от 0 и их координатах в исходном массиве. Примерно [ x, y, 1] и т.д.
import pandas as pd def row(s): return s[0] != '0' file = 'samp.xlsx' xl = pd.ExcelFile(file) print(xl.sheet_names) df1 = xl.parse('Лист1') print (df1) df2 = filter(row, df1) print (df2)
В меру понимания пробовал фильтрацию, но не выводится матрица df2
Отслеживать
ComboWombat
задан 21 фев 2022 в 12:34
ComboWombat ComboWombat
25 3 3 бронзовых знака
Ваш код где? Нам не надо задания давать. И что это за матрица такая? Это список списков?
21 фев 2022 в 12:38
Делаете цикл в цикле — по y и по x , да обходите матрицу. В чём проблема?
21 фев 2022 в 12:40
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Без numpy
Перебираем строки, в строках перебираем элементы. Если элемент не нулевой выдаём адрес и значение. На верхнем уровне собираем всё в список:
def nonzeros(a): for i, r in enumerate(a): for j, v in enumerate(r): if v != 0: yield i, j, v a = [ [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0] ] b = list(nonzeros(a)) print(b)
$ python convert.py [(1, 2, 1), (1, 3, 1), (1, 4, 1), (2, 1, 1), (2, 2, 1), (2, 3, 1), (2, 4, 1), (2, 5, 1), (3, 1, 1), (3, 2, 1), (3, 3, 1), (3, 4, 1), (3, 5, 1), (4, 2, 1), (4, 3, 1), (4, 4, 1)]
С numpy
b = np.nonzero(a) возвращает списки ненулевых координат: отдельно список индексов строк, отдельно список индексов столбцов.
c = a[b] возвращает все значения адресованные b .
b + (c, ) собирает индексы и значения вместе.
np.column_stack превращает список массивов в единый двумерный массив. Это аналог zip .
import numpy as np a = np.array([ [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0], [0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0] ]) # b = ( # array([1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4]), # array([2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 2, 3, 4]) # ) b = np.nonzero(a) # c = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] c = a[b] # d = [[1 2 1] [1 3 1] . [4 4 1]] # or use d = list(zip(*b, c)) d = np.column_stack(b + (c, )) print(d)
$ python convert.py [[1 2 1] [1 3 1] [1 4 1] [2 1 1] [2 2 1] [2 3 1] [2 4 1] [2 5 1] [3 1 1] [3 2 1] [3 3 1] [3 4 1] [3 5 1] [4 2 1] [4 3 1] [4 4 1]]
