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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python list список или задайте свой вопрос.

дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.7.41110

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Из одномерного массива в двумерный

Из одномерного массива в двумерный
Как реализовать функцию по конвертации одномерного массива в двумерный? Вот так реализовал:из.

Из одномерного массива в двумерный
Даны входные данные Как можно разделить одномерный массив на двумерный. Вот так

Из одномерного массива сделать двумерный
Дан одномерный массив ai (i =1; . n) Построить двумерный массив a1 a2 . an, a2 a3 . a1, .

Перевод одномерного массива в двумерный
Здравствуйте. Столкнулся с данной проблемой, необходимо перевести одномерный массив в двумерный.

Сообщение от Demoralization
Сообщение от Demoralization

Сообщение от Welemir1

Появилась идея для ИНС, типа числа и буквы разложить в двоичный код, а потом сделать из него массивы и загонять в ИНС, как-то так. Или говно идея?
P.S.: в голове идея типа — массив [1011], и из него сделать [10][11]. Как-то так

Добавлено через 3 минуты
А вообще спасибо за вашу небольшую помощь

Сообщение от Demoralization

Сделать из одномерного массива двумерный
Необходимо из одномерного массива перенести все значения в двумерный массив по столбцам. Например.

Из одномерного массива сформировать двумерный
Доброго времени суток, уважаемые ситуации. Такая задача (Visual Basic 6.0): Из имеющегося.

Из одномерного массива сформировать двумерный
Задан одномерный массив из 16 элементов. Сформировать двухмерный массив 4×4, в котором.

из одномерного массива сформировать двумерный
из одномерного массива (1 2 3 4 5) сформировать двумерный (1 2 3 4 5) (2 3 4 5 1) (3 4 5 1 2) и.

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

проверка того, содержит ли массив Numpy заданную строку (3)

Есть ли Pythonic и эффективный способ проверить, содержит ли массив Numpy хотя бы один экземпляр данной строки? Под «эффективным» я подразумеваю, что он заканчивает поиск первой совпадающей строки, а не итерации по всему массиву, даже если результат уже найден.

С массивами Python это можно выполнить очень чисто, if row in array: но это не работает, как я ожидал бы для массивов Numpy, как показано ниже.

С массивами Python:

но массивы Numpy дают разные и довольно странные результаты. (Метод __contains__ ndarray кажется недокументированным.)

Numpys __contains__ на момент написания этой статьи (a == b).any() который, возможно, справедлив только в том случае, если b является скаляром (он немного волосатый, но я считаю, что он работает только в 1.7. позже — это был бы правильный общий метод (a == b).all(np.arange(a.ndim — b.ndim, a.ndim)).any() , что имеет смысл для всех комбинаций a и b размерность) .

EDIT: Чтобы быть ясным, это не обязательно ожидаемый результат при трансляции. Также кто-то может утверждать, что он должен обрабатывать элементы отдельно, как np.in1d делает np.in1d . Я не уверен, что есть один ясный способ, которым он должен работать.

Теперь вы хотите, чтобы numpy остановился, когда обнаружил первое вхождение. В настоящее время этого AFAIK не существует. Это сложно, потому что numpy основан в основном на ufuncs, которые делают то же самое по всему массиву. Numpy оптимизирует такие сокращения, но эффективно работает только тогда, когда уменьшенный массив уже является булевым массивом (например, np.ones(10, dtype=bool).any() ).

В противном случае для __contains__ которая не существует, потребуется специальная функция. Это может показаться странным, но вы должны помнить, что numpy поддерживает многие типы данных и имеет более крупный механизм для выбора правильных и выбора правильной функции для работы над ним. Другими словами, механизм ufunc не может этого сделать, и реализация __contains__ или такого специально не является фактически тривиальным из-за типов данных.

Вы можете, конечно, написать его в python, или, поскольку вы, вероятно, знаете свой тип данных, писать его сами в Cython / C очень просто.

Тем не менее. Часто гораздо лучше использовать подход, основанный на сортировке для этих вещей. Это немного утомительно, так как нет никакой вещи, такой как searchsorted для lexsort , но она работает (вы также можете злоупотреблять scipy.spatial.cKDTree если хотите). Это предполагает, что вы хотите сравнить только по последней оси:

Это также работает для массива b , и если вы сохраняете отсортированный массив вокруг, также намного лучше, если вы делаете это для одного значения (строки) в b за раз, когда остается неизменным (иначе я бы просто np.in1d после просмотра в виде повтора). Важно: вы должны сделать np.ascontiguousarray для обеспечения безопасности. Обычно это ничего не делает, но если это произойдет, это будет большой потенциальной ошибкой в ​​противном случае.

Вы можете использовать .tolist ()

Или используйте представление:

Или сгенерируйте список numpy (возможно, ОЧЕНЬ МЕДЛЕННО):

Или используйте логические функции numpy:

Если у вас есть время:

Вы можете увидеть этот хит или промах, процедуры numpy — это одинаковая скорость для поиска массива . Python in операторе потенциально намного быстрее для раннего попадания, а генератор — просто плохая новость, если вам нужно пройти весь путь через массив.

Ниже приведены результаты для массива элементов размером 300 000 x 3:

И для 3 000 000 x 3 массива:

Который, кажется, указывает, что np.equal является самым быстрым чистым способом numpy сделать это .

будут перечислены строки, которые соответствуют. Как указывает Джейми, чтобы узнать, существует ли хотя бы одна такая строка, используйте any :

В стороне:
Я подозреваю (и __contains__ ) как указано выше, но используя any а не all .

Создаем одномерный массив из многомерного

Задача, которой я хотел бы посвятить эту статью, у некоторых не так часто встречается или пока ещё вовсе не попадалась — создание одномерного массива из многомерного. Однако, на форумах время от времени эта тема поднимается, а кроме того, за последние два месяца, мне приходилось несколько раз решать нестандартные ситуации, связанные с этим вопросом.

Всё достаточно просто, если исходный массив у нас двумерный. Возьмём, для примера, такой:

В самом обычном цикле, делаем слияние каждого из вложенных массивов с результирующим массивом (изначально пустым), используя функцию array_merge() и записывая результат слияния в этот же конечный массив:

Можно конечно и поизвращаться, но больше для расширения кругозора, чем для реальной практики в данной задаче. Будем использовать две функций: array_map() — применяет callback-функцию к каждому элементу массива и функцию array_merge(), которую рассматривали выше.

Немного расшифрую: в качестве callback-функции, мы используем анонимную функцию, которая получает поочерёдно каждый из вложенных массивов в переменную "$a" и сливает с массивом "$arrOut", который в итоге и будет содержать все значения исходного массива, но уже как одномерным. Так как внутри callback-функции массив "$arrOut" будет не виден (если только он не объявлен глобальным), мы используем ключевое слово use, которое позволяет использовать внешние переменные. Но передаём массив не как значение, а как "ссылку", поставив перед переменной символ амперсанда "&". Если бы мы этого не сделали, то каждый раз, мы получали бы пустой массив "$arrOut", который сливали с текущим "$a".
Для новичков всё это пока малопонятно и, пытаясь адаптировать код под свои нужды, могут наделать ошибок. Не пугайтесь — есть решение «в пару строк»;) Используем функцию call_user_func_array(), которая, по сути, сделает всё то, что мы делали во втором примере, но, так сказать, одним махом.

В результате всех вышеупомянутых вариантов, мы получим массив такого вида:

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

Остаётся выяснить, какой из трёх вариантов работает быстрее. Я сгенерировал массив, состоящий из сотни вложенных массивов, в каждом из которых по десять элементов и вот средние результаты, которые говорят сами за себя:

Способ секунд
Цикл + array_merge 0.0109
array_map + array_merge 0.0170
call_user_func_array 0.0009

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

Вполне нормальный способ, который, на мой взгляд, не требует каких-то подробных разъяснений и хорошо справляется со своей задачей. Многие, даже не задумываясь, именно его бы и применили. Но я хочу показать, как это же можно сделать буквально парой строк кода, используя «итераторы» из стандартной библиотеки PHP (SPL):

Вот и всё! И результат будет, как и в первом случае такой:

Ну, и как в первом случае, показываю среднюю скорость выполнения двух вариантов:

Способ секунд
Рекурсия 0.2558
Классы итераторов 0.0346

Разница в скорости — более, чем в семь раз и кода меньше примерно во столько же! Дальнейшие комментарии излишни. 😉

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *