Как из одномерного массива сделать двумерный?
Всё ещё ищете ответ? Посмотрите другие вопросы с метками 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 |
Разница в скорости — более, чем в семь раз и кода меньше примерно во столько же! Дальнейшие комментарии излишни. 😉
В общем, вывод можно сделать следующий: создать одномерный массив из многомерного можно достаточно легко, но если еще и хорошо порыться в документации, то «не изобретая свой велосипед», это можно сделать буквально несколькими строками кода и работать будет лучше и быстрее.