Сделать из двумерного массива одномерный python

Преобразование многомерного списка в одномерный список в Python

Многомерный список, например l=[[1,2],[3,4]] , можно преобразовать в 1D, выполнив sum(l,[]) . Может кто-нибудь объяснить, как это происходит? Ответчик сказал, что этот метод можно использовать только для «сглаживания» 2D-списка — что он не будет работать для более высоких многомерных списков. Но это происходит, если повторять. Например, если A является 3D-списком, тогда сумма (сумма (A), []), []) сгладит A до 1D-списка.

Также обратите внимание, что небезопасно преобразовывать только одну последовательность в 1D, поскольку тривиально создавать последовательности с действительно бесконечным числом измерений: a = []; a.append(a) .

7 ответов

sum добавляет последовательность вместе с помощью оператора + . например, sum([1,2,3]) == 6 . Второй параметр является необязательным начальным значением, которое по умолчанию равно 0. например. sum([1,2,3], 10) == 16 .

В вашем примере это [] + [1,2] + [3,4] , где + в 2 списках объединяет их вместе. Поэтому результат [1,2,3,4]

Пустой список требуется как 2-й параметр для sum , потому что, как упоминалось выше, значение по умолчанию для sum добавляется к 0 (т.е. 0 + [1,2] + [3,4] ), что приведет к неподдерживаемому типу операндов для +: ‘int’ и ‘list’

Это соответствующий раздел справки для sum :

sum (sequence [, start]) → значение

Возвращает сумму последовательности числа (NOT строки) плюс значение параметра «start» (по умолчанию до 0).

Как wallacoloo, это означает не общее решение для выравнивания любого многомерного списка. Он просто работает для списка 1D-списков из-за описанного выше поведения.

Для выравнивания 1 уровня вложенности см. этот рецепт на странице itertools:

def flatten(listOfLists): "Flatten one level of nesting" return chain.from_iterable(listOfLists) 

Чтобы сгладить более глубоко вложенные списки (включая нерегулярно вложенные списки), см. принятый ответ на этот вопрос (есть и другие вопросы, связанные с этим вопросом).

Обратите внимание, что рецепт возвращает объект itertools.chain (который является итерируемым), а другой вопрос отвечает на объект generator , поэтому вам нужно обернуть любой из них при вызове list , если вы хотите получить полный список а не повторять его. например list(flatten(my_list_of_lists)) .

Большое спасибо, понял. Могу я спросить, какой самый короткий и лучший способ сгладить список? В настоящее время я могу думать только о запуске двух вложенных циклов или рекурсивной функции для этого.

Я сделал быстрое обновление к ответу с рецептом для выравнивания 1 уровня вложенности и ссылкой на предыдущий вопрос SO с более общим решением.

Если ваш список nested является, как вы говорите, «2D» (это означает, что вы хотите только идти на один уровень вниз, а все элементы с 1 уровнем ниже nested — это списки), простое понимание списка

flat = [x for sublist in nested for x in sublist] 

— это тот подход, который я бы рекомендовал — гораздо эффективнее, чем sum ming будет ( sum предназначен для чисел) — это было слишком много для того, чтобы как-то сделать он блокирует все попытки «суммировать» не числа. Я был оригинальным разработчиком и первым исполнителем sum в стандартной библиотеке Python, поэтому, я думаю, я должен знать; -).

Читайте также:  Python appending string to string

Если вы хотите спуститься «как можно глубже» (для глубоко вложенных списков), рекурсия — самый простой способ, хотя, устраняя рекурсию, вы можете получить более высокую производительность (по цене более высокого уровня сложности).

Этот рецепт предлагает рекурсивное решение, устранение рекурсии и другие подходы (все поучительные, хотя и не такие простые, как однострочный, который я предложил ранее в этом ответе).

Ах, я был уверен, что смогу сделать это, используя списочное понимание, но все испортил код. Спасибо и привилегия!

@alex-martelli alex-martelli, это решение прекрасно работает, но мне трудно понять. Не могли бы вы рассказать мне о порядке операций, которые выполняет python при выполнении этого решения?

@NobodyMan, конечно, это всего лишь два вложенных цикла: точно так же, как если бы во внешнем операторе for sublist in nested: вы добавили еще один оператор for x in sublist: а затем внутри него просто взяли ведущее выражение x понимания списка, которое нужно добавить в качестве следующего элемента нового списка вы строите. Другими словами, он работает точно так же, как любое другое понимание списка с двумя предложениями for хотя в этом случае начальное выражение перед предложениями for чрезвычайно простое :-).

Для любого типа многодиапазонного массива этот код будет сглаживать до одного измерения:

def flatten(l): try: return flatten(l[0]) + (flatten(l[1:]) if len(l) > 1 else []) if type(l) is list else [l] except IndexError: return [] 

Источник

Как преобразованить двумерный список в одномерный?

Преобразовать одномерный список в двумерный
Дано: l — "простой" список, obj — атом. Сформировать списки из заданного obj с каждым .

Как преобразовать двумерный список строк целых чисел в двумерный список просто целых чисел?
"Напишите программу, на вход которой подаётся прямоугольная матрица в виде последовательности.

двумерный вывести как одномерный
Подскажите, пожалуйста, как в паскале двумерный массив вывести в виде одномерного и обратно

Как одномерный массив преобразовать в двумерный
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <conio.h>.

Как перевести двумерный массив в одномерный?
Как сформулировать одномерный массив из положительных элементов двумерного массива? Я написал код.

Эксперт Python

Лучший ответ

Сообщение было отмечено nikki4 как решение

Решение

>>> lst=['abc',['d', 'e'],['f', 'g']] >>> result=[] >>> for e in lst: . if type(e) is list: . result+=e . else: . result.append(e) . >>> result ['abc', 'd', 'e', 'f', 'g']
def fun(lst, result = []): for i in lst: if isinstance(i,list): fun(i, result) else: result.append(i) return result lst=['abc',['d', 'e'],['f', 'g',[1,2,3]]] print(fun(lst))

Эксперт Python

def flatten(sequence): if type(sequence) is list: for itm in sequence: yield from flatten(itm) else: yield sequence obj = [[1,2, [3,4]], 5, 6] print(list(flatten(obj)))

Как преобразовать одномерный массив в двумерный?
Есть масcив типа ABCDEFG нужно чтобы каждый пятый элемент начинался с новой строки ABCDE FG Как.

Читайте также:  Java been java now

Как перевести одномерный массив в двумерный?
Привет) В общем задача такая: Задать не простое число L. Найти 2 числа L1 и L2, произведение.

Как переконвертировать двумерный массив в одномерный
Здравствуйте! Подскажие пожалуйста, как из двумерного массива mas получить одномерный к примеру x

Как превратить двумерный массив в одномерный?
Здравствуйте! Прошу помощи. Не знаю, как исправить код ниже для Эксель, чтобы одномерный массив.

Как узнать, массив одномерный или двумерный?
Есть ли простая функция? Если нет — то как это сделать на циклах?

Источник

Как использовать функцию reshape() библиотеки NumPy в Python

Библиотека NumPy имеет множество различных функций для работы с многомерными массивами. Функция reshape() – одна из них. Она используется для изменения формы любого существующего массива без изменения данных, которые в нем находятся.

Форма определяется общим количеством элементов в каждом измерении. С помощью функции reshape() можно добавлять или удалять измерения в массиве, а также изменять количество элементов в каждом измерении. Например, можно преобразовать одномерный массив в многомерный (но не наоборот!).

В этой статье мы расскажем, как использовать функцию reshape() и каков принцип ее работы.

cube shape

Синтаксис

Давайте начнем с синтаксиса функции reshape() . Вот так он выглядит в общем виде:

numpy.reshape(np_array, new_shape, order='C')

Эта функция может принимать три аргумента. Первый и второй аргументы являются обязательными, а третий — опциональный.

Исходный массив NumPy, форму которого мы хотим изменить, – это значение первого аргумента ( np_array ).

Форма массива устанавливается во втором аргументе ( new_shape ). Его значение может быть целым числом или кортежем целых чисел.

Значение третьего аргумента определяет порядок заполнения массива и переноса элементов в преобразованном массиве. Возможных значений три: «C», «F» или «A». Давайте разберем, что значит каждый из этих вариантов.

order=’C’

Упорядочивание индексов в стиле языка C. Индекс последней оси изменяется быстрее, а индекс первой — медленнее.

Упорядочение в стиле C: индексация идет слева направо, потом перемещается на вторую строку и снова идет слева направо, дальше перемещается на третью.

order=’F’

Упорядочивания индексов в стиле языка Фортран. Индекс первой оси изменяется быстрее, а индекс последней — медленнее.

Упорядочение в стиле Фортран: индексация идет в первом столбце сверху вниз, потом переходит на второй столбец и снова идет сверху вниз, потому (аналогично) - на третий и четвертый столбцы.

order=’A’

Варианты «C» и «F» не учитывают макет памяти основного массива. Они относятся лишь к порядку индексации. Порядок «A» означает чтение и запись элементов в стиле Фортран, если исходный массив в памяти тоже в стиле Фортран. В противном случае применяется C-подобный стиль.

Использование функции reshape()

Первым делом, прежде чем попрактиковаться в использовании данной функции, вам следует импортировать библиотеку NumPy. После этого можно приступать к работе.

Далее мы покажем различные варианты использования функции reshape() .

Пример 1: преобразование одномерного массива в двумерный

Итак, давайте разберем, как с помощью функции reshape() преобразовать одномерный массив в двумерный.

Читайте также:  Java stream offset limit

В этом сценарии для создания одномерного массива из 10 элементов используется функция arange() .

Первая функция reshape() используется для преобразования одномерного массива в двумерный, состоящий из 2 строк и 5 столбцов. Здесь функция reshape() вызывается с использованием имени модуля np .

А вторая функция reshape() используется для преобразования одномерного массива в двумерный, состоящий из 5 строк и 2 столбцов. Здесь уже функция reshape() вызывается с использованием массива NumPy с именем np_array .

import numpy as np np_array = np.arange(10) print("Исходный массив : \n", np_array) new_array = np.reshape(np_array, (2, 5)) print("\n Измененный массив с 2 строками и 5 столбцами : \n", new_array) new_array = np_array.reshape(5, 2) print("\n Измененный массив с 5 строками и 2 столбцами : \n", new_array)

Если вы запустите описанную выше программу, то получите результат, как на следующем скриншоте. Первый print() показывает исходный массив, а второй и третий выводят преобразованные массивы.

1 3

Пример 2: преобразование одномерного массива в трехмерный

Теперь давайте посмотрим, как при помощи функции reshape() преобразовать одномерный массив в трехмерный.

Воспользуемся функцией array() для создания одномерного массива из 12 элементов.

Функция reshape() преобразует созданный одномерный массив в трехмерный размером 2х2х3. Здесь функция reshape() вызывается с использованием NumPy-массива np_array .

import numpy as np np_array = np.array([7, 3, 9, 11, 4, 23, 71, 2, 32, 6, 16, 2]) print("Исходный массив : \n", np_array) new_array = np_array.reshape(2, 2, 3) print("\n Преобразованный 3D массив : \n", new_array)

Выполнив данный код, вы получите следующий вывод. Как и в прошлый раз, первый print() показывает изначальный массив, второй – преобразованный массив.

2

Пример 3: изменение формы массива NumPy с учетом порядка

Как вы помните, у функции reshape() есть третий — опциональный — аргумент, задающий порядок индексации. Давайте посмотрим, как он применяется на практике.

Как и в первом примере, воспользуемся функцией arange() для создания одномерного массива из 15 элементов.

Первая функция reshape() используется для создания двумерного массива из 3 строк и 5 столбцов с упорядочением в стиле C. В то время как вторая функция reshape() используется для создания двумерного массива из 3 строк и 5 столбцов с упорядочением в стиле Фортрана.

import numpy as np np_array = np.arange(15) print("Исходный массив : \n", np_array) new_array1 = np.reshape(np_array, (3, 5), order='C') print("\n Преобразованный 2D массив, упорядоченный в стиле С : \n", new_array1) new_array2 = np.reshape(np_array, (3, 5), order='F') print("\n Преобразованный 2D массив, упорядоченный в стиле Фортрана : \n", new_array2)

Давайте выполним наш код. Вот, что мы получим. Как и раньше, первый print() показывает исходный массив значений. Второй print() показывает значения массива, упорядоченного по строкам. Третий – упорядоченного по столбцам.

3

Итоги

Итак, в этой статье мы подробно описали, как использовать функцию reshape() для преобразования массива из одной формы в другую. Цели и особенности использования данной функции становятся достаточно прозрачными после изучение примеров, которые мы привели выше.

Источник

Оцените статью