Что подразумевается под поддержкой 2D-массива?

Я читал, что Python фактически не поддерживает 2D-массивы, а представляет собой массив массива. Я понимаю массив массива, но что это значит, поддерживая 2D-массивы?

В C 2D-массив просто преобразуется в 1D-массив, делая некоторую причудливую математику (см. Здесь ). Существуют ли языки, которые реализуют реальные 2D-массивы?

Спасибо за помощь, и я надеюсь, что я не написал дублирующий вопрос; если да, дайте мне ссылку и закройте мой вопрос 🙂

7 Solutions collect form web for “Что подразумевается под поддержкой 2D-массива?”

Существуют языки, реализующие массивы 2D (или 3D и т. Д.). Фортран является одним из них. Это означает, что вы можете написать выражение индекса массива, такое как array[x,y] и язык позаботится о математике, чтобы найти правильный элемент.

Кроме того, Numpy представляет собой числовое расширение для Python, которое обеспечивает n-мерные массивы.

Кто-то уже упомянул numpy , и OP прокомментировал, что «он вернулся к математике с фантастическим указателем с массивами C» – это абсолютно тривиальная деталь реализации! Поскольку базовая память в (нормальном 😉 -компьютере может рассматриваться как массив байтов (или слов), то, конечно, любая структура данных вообще реализуется в верхней части этого массива (или его фрагментов) плюс «причудливая указательная математика» «- очереди с двойным концом, многомерные массивы, двоичные деревья, вы называете это, базовые реализации всегда будут сводиться к такому (как и все причудливые структуры управления, сводятся к условным и безусловным переходам на уровне машины и т. д. ). ТАК ЧТО ?! Конечно, это детали реализации . numpy , как и Fortran, а также другие языки и библиотеки, обеспечивает N-мерные массивы – независимо от того, как они реализуют их «глубоко внутри» (на самом деле numpy довольно близок к этому, так как вы можете легко сгладить и переделать массивы – это довольно типично Python, чтобы обеспечить абстракции более высокого уровня с довольно хорошими «крючками» относительно того, как они относятся к более низким уровням ;-).

Например,

 >>> import numpy >>> x = numpy.arange(12) >>> x array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> x.reshape((3,4)) array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> x.reshape((4,3)) array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) >>> x.reshape((4,3))[::2, ::2] array([[0, 2], [6, 8]]) >>> x.reshape((4,3))[(0,1,3), ::2] array([[ 0, 2], [ 3, 5], [ 9, 11]]) >>> 

Вы можете изменять, индексировать, нарезать и форматировать данные в N-мерном массиве с высокой гибкостью и отличной производительностью – даже зная, что базовый блок данных – это просто одномерный массив (здесь x рождается и остается 1-D , но даже если бы это было не так, вы могли бы получить доступ к базовому 1-D массиву путем сглаживания).

Это то, что означает «поддержка N-мерного массива» (хотя в большинстве других языков и фреймворков, предлагающих такую ​​поддержку, вы можете получить меньше прозрачности, более низкой функциональности или обоих ;-).

C # имеет многомерные массивы , но их рекомендуется использовать в качестве зубчатых массивов (массивов массивов), которые более эффективны.

У Fortran есть реальные многомерные массивы. Эта ссылка говорит о них в деле FORTRAN 77.

Я предполагаю, что «поддержка 2D-массивов» означает, как язык позволяет вам получать доступ к данным, как если бы это был 2D-массив. В c причудливая математика скрыта конструкциями массива:

 char arr[5][5]; char c = arr[2][3]; 

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

На самом деле память представляет собой большой кусок адресных байтов данных [0,1,2,3,4,5,6 … конец памяти], поэтому нет «родного» представления 2D-массива, что-то где-то нужно перевести программистов «строка 1 col 2» на фактический адрес в памяти. Языки программирования обычно дают вам возможность скрыть перевод.

Фактические массивы в Python, то есть объект array созданный модулем array , строго одномерны. Это то, что вы, вероятно, не будете использовать, если ваш код не должен взаимодействовать с структурами данных C, вы работаете с огромным количеством данных, которые должны храниться в памяти, или вы пишете что-то вроде numpy .

В Rosetta Code есть примеры Python для создания двухмерного массива .

  • Написание telnet-клиента
  • numpy вокруг / rint slow по сравнению с astype (int)
  • массив numpy C api
  • Как передать аргументы командной строки при использовании ideone?
  • Нет в boost.python
  • NumPy C-API: преобразовать тип объекта в тип номера
  • Выбор интерфейсного / интерпретатора для научного кода
  • Внедрение протокола AirDrop
  • Python - лучший язык программирования в мире.