Как создать пустой массив в python
Перейти к содержимому

Как создать пустой массив в python

  • автор:

Как создать пустой массив в python

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

здравствуйте сейчас начал изучать python и не могу понять,а как создать пустой массив определенного размера.если в c мы просто писали int s[100]
то как создать такой же пустой массив в python.
спасибо заранее.

питон несколько специфичен, относительно С. можно просто создать пустой массив

и затем добавлять в него «нулевые» (пустые) элементы

a.append(0) a = a + [0] a += [0]

полная свобода действий. и потенциальных ошибок. )))

пишу код не только за печеньки

Как создать пустой массив и затем добавить его в NumPy?

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

>>> import numpy as np >>> a = np.zeros(shape=(3, 2)) >>> a array([[ 0., 0.], [ 0., 0.], [ 0., 0.]]) >>> a[0] = [1, 2] >>> a[1] = [3, 4] >>> a[2] = [5, 6] >>> a array([[ 1., 2.], [ 3., 4.], [ 5., 6.]]) 

Поделиться 20 февраля 2009 в 10:36

Массив NumPy — это очень отличная от списка структура данных и предназначен для использования различными способами. Ваше использование hstack потенциально очень неэффективно. каждый раз, когда вы вызываете его, все данные в существующем массиве копируются в новый. (Функция append будет иметь ту же проблему.) Если вы хотите создать матрицу по одному столбцу за раз, вам может быть лучше сохранить ее в списке до тех пор, пока она не будет завершена, и только затем преобразовать ее в массив. например,

 mylist = [] for item in data: mylist.append(item) mat = numpy.array(mylist) 

item может быть списком, массивом или любым итерируемым объектом, если каждый item имеет одинаковое количество элементов.
В этом конкретном случае ( data — это некоторый итерируемый объект, содержащий столбцы матрицы) вы можете просто использовать

 mat = numpy.array(data) 

(Также обратите внимание, что использование list в качестве имени переменной, вероятно, не является хорошей практикой, так как оно маскирует встроенный тип этим именем, что может привести к ошибкам.) РЕДАКТИРОВАТЬ: Если по какой-то причине вы действительно хотите создать пустой массив, вы можете просто использовать numpy.array([]) , но это редко бывает полезно!

Поделиться 20 февраля 2009 в 10:44

Чтобы создать пустой многомерный массив в NumPy (например, двумерный массив m*n для хранения вашей матрицы), в случае, если вы не знаете m , сколько строк вы будете добавлять, и вам не важны вычислительные затраты, упомянутые Стивеном Симмонсом (а именно перестроение массива при каждом добавлении), вы можете прижать к 0 размерность, к которой вы хотите добавить: X = np.empty(shape=[0, n]) . Таким образом вы можете использовать, например (здесь m = 5 , который мы предполагаем не знали при создании пустой матрицы, и n = 2 ):

import numpy as np n = 2 X = np.empty(shape=[0, n]) for i in range(5): for j in range(2): X = np.append(X, [[i, j]], axis=0) print X 

что даст вам:

[[ 0. 0.] [ 0. 1.] [ 1. 0.] [ 1. 1.] [ 2. 0.] [ 2. 1.] [ 3. 0.] [ 3. 1.] [ 4. 0.] [ 4. 1.]] 

Поделиться 10 апреля 2014 в 04:34

Я много размышлял над этим, потому что мне нужно было использовать numpy.array в качестве набора в одном из моих школьных проектов, и мне нужно было инициализировать пустым. Я не нашел никакого соответствующего ответа здесь на Stack Overflow, поэтому я начал рисовать что-то.

# Initialize your variable as an empty list first In [32]: x=[] # and now cast it as a numpy ndarray In [33]: x=np.array(x) 

Результат будет:

In [34]: x Out[34]: array([], dtype=float64) 

Поэтому вы можете напрямую инициализировать массив np следующим образом:

In [36]: x= np.array([], dtype=np.float64) 

Надеюсь, это поможет.
Поделиться 10 апреля 2013 в 12:39
Для создания пустого массива NumPy без определения его формы вы можете сделать следующее:

arr = np.array([]) 

Первый вариант предпочтительнее, потому что вы знаете, что будете использовать его как массив NumPy. NumPy преобразует это в тип np.ndarray после этого, без дополнительного [] ‘размера’. для добавления нового элемента в массив мы можем сделать следующее:

arr = np.append(arr, 'new element') 

Обратите внимание, что в фоновом режиме для Python нет такого элемента, как массив без определения его формы. Как упомянул @hpaulj, это также делает одноразовый массив.

Поделиться 14 апреля 2020 в 06:23
Вы можете использовать функцию добавления. Для строк:

>>> from numpy import * >>> a = array([10,20,30]) >>> append(a, [[1,2,3]], axis=0) array([[10, 20, 30], [1, 2, 3]]) 

Для столбцов:

>>> append(a, [[15],[15]], axis=1) array([[10, 20, 30, 15], [1, 2, 3, 15]]) 

РЕДАКТИРОВАТЬ
Конечно, как упоминалось в других ответах, если вы не выполняете какую-то обработку (например, инверсию) матрицы/массива КАЖДЫЙ раз, когда вы добавляете что-то в него, я просто создаю список, добавляю в него, а затем преобразую его в массив.

Поделиться 20 февраля 2009 в 10:27
Вот несколько обходных путей, чтобы сделать numpys более похожими на списки

np_arr = np.array([]) np_arr = np.append(np_arr , 2) np_arr = np.append(np_arr , 24) print(np_arr) 

ВЫВОД: массив([ 2., 24.])
Поделиться 05 февраля 2020 в 08:41

Если вы абсолютно не знаете конечный размер массива, вы можете увеличить размер массива таким образом:

my_arr = numpy.zeros((0,5)) for i in range(3): my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) ) print(my_arr) [[ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.] [ 1. 1. 1. 1. 1.]] 
  • Обратите внимание на 0 в первой строке.
  • numpy.append — это еще один вариант. Он вызывает numpy.concatenate .

Поделиться 06 сентября 2011 в 21:20

Вы можете применить это для создания любого типа массива, например, нулей:

a = range(5) a = [i*0 for i in a] print a [0, 0, 0, 0, 0] 

Поделиться 01 октября 2015 в 17:50

Еще один простой способ создать пустой массив, который может принимать массив:

import numpy as np np.empty((2,3), dtype=object) 

Поделиться 11 марта 2021 в 07:11

В зависимости от того, для чего вы используете это, вам может понадобиться указать тип данных (см. ‘dtype’).

Например, чтобы создать двухмерный массив из 8-битных значений (подходит для использования в качестве монохромного изображения):

myarray = numpy.empty(shape=(H,W),dtype='u1') 

Для RGB-изображения включите количество цветовых каналов в форму: shape=(H,W,3)

Возможно, вам также захочется рассмотреть нулевую инициализацию с помощью numpy.zeros вместо использования numpy.empty . См. примечание здесь.

Поделиться 11 сентября 2016 в 00:28

Я думаю, что вы можете создать пустой массив numpy, например:

>>> import numpy as np >>> empty_array= np.zeros(0) >>> empty_array array([], dtype=float64) >>> empty_array.shape (0,) 

Этот формат полезен, когда вы хотите добавить массив numpy в цикл.

Поделиться 30 августа 2019 в 13:47

Я думаю, что вы хотите обработать большую часть работы со списками, а затем использовать результат в виде матрицы. Возможно, это способ ;

ur_list = [] for col in columns: ur_list.append(list(col)) mat = np.matrix(ur_list) 

Поделиться 09 октября 2018 в 06:43

Вам может быть лучше использовать vstack в общем случае, когда вам может понадобиться добавить массив массивов. Например, предположим, вы генерируете партии и накапливаете их.

import numpy as np embeddings = np.empty((0, 768), dtype=np.float32) for i in range(10): batch = generate() # shape: (64, 768) embeddings = np.vstack((embeddings, batch)) 

Поделиться 19 июля 2023 в 11:12

Возможно, то, что вы ищете, выглядит примерно так:

x=np.array(0) 

Таким образом, вы можете создать массив без элементов. Это похоже на:

Таким образом, вы сможете добавлять новые элементы в свой массив заранее.

Поделиться 19 июня 2020 в 23:38

Самый простой способ

import numpy as np data = np.zeros((0, 0), dtype=float) # (rows,cols) data.shape 
for i in range(n_files): data = np.append(data, new_data, axis = 0) 

Массивы

Массив (англ. array) — структура данных, хранящая набор значений. Каждое значение из набора индексируется, т.е. значения имеют номера (индексы).

Простейший массив имеет следующий интерфейс

  1. создать(A, N) -> массив A длины N — создание массива A размера N .
  2. записать(A, i, x) — записывает значение x в i -ый элемент массива A .
  3. считать(A, i) -> элемент массива A с индексом i — взятие элемента по индексу (чтение).
  4. удалить(A) — удаление массива А .

Обычно индексами массива являются целые положительные числа, причём в непрерывном диапазоне. Например, 0, 1, 2. N-2, N-1 , где N — размер массива. В таком случае массив упорядочен по индексу и можно говорить, что массив также является последовательностью.

Для массива операции чтения и записи выполняются за O(1) , т.е. время этих операций не зависит от количества элементов в массиве.

Массив в Python

Массив в Python

упорядоченная изменяемая последовательность. массив хранит множество элементов, которые образуют последовательность. При этом можно изменять как сами элементы массива, так и сам массив: пополнять массив новыми элементами или удалять их. . объектов произвольных типов элементами массива являются Python-объекты. При этом допускается, чтобы в одном массиве хранились объекты разных типов.

Массивы в Python также называют списками или листами (англ. list). Терминология в других языках программирования, а также в теории алгоритмов может быть другая.

Список Python является гибким в использовании объектом. Как инструмент, программист может использовать списки, например, для создания элементов линейной алгебры: точек, векторов, матриц, тензоров. Или, например, для таблицы с некоторыми данными.

Важно заметить, что , питоновский список, является универсальной структурой данных. В том числе, ей можно пользоваться как массивом (что мы и будем делать)! То есть, у этого объекта есть интерфейс, описанный в предыдущем разделе, причём с теми же асимптотиками, хотя возможности выходят гораздо за пределы простейшего массива.

Создание массива

Литерал массива

Массив можно создать при помощи литералов. Литерал — это код, который используется для создания объекта «вручную» (задания константы). Например, некоторые литералы уже изученных ранее объектов:

  • int : 5 , -23
  • float : 5. , 5.0 , -10.81 , -1.081e1
  • str : ‘ABCdef’ , «ABCdef»

В случае массива литералом являются квадратные скобки [] , внутри которых через запятую , перечисляются элементы массива:

>>> [] [] >>> [0, 1, 2, 3, 4] [0, 1, 2, 3, 4] >>> [‘sapere’, ‘aude’] [‘sapere’, ‘aude’] >>> [‘Gravitational acceleration’, 9.80665, ‘m s^-2’] [‘Gravitational acceleration’, 9.80665, ‘m s^-2’] >>> type([0, 1, 2, 3, 4])

Создание массива заданной длины, склеивание массивов

Чтобы создать массив наперёд заданной длины, нужно задать инициализируещее значение и длину. Ниже создаётся массив, содержащий 10 нулей.

>>> A = [0] * 10 >>> A [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] >>> type(A)

С похожим синтаксисом мы сталкивались при работе со строками. Массивы в Python можно «склеивать» с помощью знака сложения:

>>> A = [0] * 3 # [0, 0, 0] >>> B = [1] * 3 # [1, 1, 1] >>> C = [2] * 3 # [2, 2, 2] >>> D = A + B + C >>> D [0, 0, 0, 1, 1, 1, 2, 2, 2] 

На самом деле, умножение массива на целое число M это создание нового массива путём M «склеиваний» исходного массива с самим собой:

>>> [0, 1] * 3 [0, 1, 0, 1, 0, 1] >>> [0, 1] + [0, 1] + [0, 1] [0, 1, 0, 1, 0, 1] 

Элементы массива: доступ и изменение

Выше мы убедились, что массив это множество объектов различных типов, теперь убедимся, что это упорядоченная последовательность изменяемых объектов.

Доступ по индексу

Для доступа к элементам массива используется операция взятия элемента по индексу. Для этого рядом с литералом или переменной массива необходимо подписать индекс элемента в квадратных скобках:

>>> ['Gravitational acceleration', 9.80665, 'm s^-2'][0] 'Gravitational acceleration' >>> ['Gravitational acceleration', 9.80665, 'm s^-2'][1] 9.80665 >>> ['Gravitational acceleration', 9.80665, 'm s^-2'][2] 'm s^-2' >>> l = [10, 20, 30] >>> l[0] 10 >>> l[1] 20 >>> l[2] 30 

Нумерация элементов массива начинается с нуля.

При запросе элемента по несуществующему индексу, Python вызовет ошибку IndexError:

>>> l [10, 20, 30] >>> l[3] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range 

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

>>> l [10, 20, 30] >>> len(l) 3 >>> l[len(l) - 1] 30 

Последняя конструкция встречается нередко, поэтому в Python существует возможность взять элемент по отрицательному индексу:

>>> l [10, 20, 30] >>> l[-1] 30 >>> l[-2] 20 >>> l[-3] 10 >>> l[-4] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range 

Таким образом для индекса n ≥ 0, l[-n] эвивалентно l[len(l) — n] .

Изменение элементов

Изменение элементов осуществляется с помощью присваивания:

>>> l = [10, 20, 30] >>> l [10, 20, 30] >>> l[0] = 0 >>> l [0, 20, 30] >>> l[2] = 55 >>> l [0, 20, 55] 

Доступ в цикле while

>>> l [0, 20, 55] >>> i = 0 >>> while i  len(l): . print(i, l[i]) . i += 1 . 0 0 1 20 2 55 >>> 

Доступ в цикле for

Наиболее универсальный способ это использование генератора range:

>>> l [0, 20, 55] >>> for i in range(len(l)): . print(i, l[i]) . 0 0 1 20 2 55 

Печать массива

Чтобы распечатать элементы массива в столбец, воспользуйтесь циклом for , как в разделе выше.

Если нужно распечатать массив в строку, то воспользуйтесь функцией print :

>>> A = [0, 1, 2, 3] >>> print(*A) 0 1 2 3 

Здесь знак * это операция развёртывания коллекции по аргументам функции. Функция print принимает на вход сколько угодно аргументов и действие выше эквиваленто следующему:

>>> print(A[0], A[1], A[2], A[3]) 0 1 2 3 

Ремарка о строках

На самом деле, мы уже ранее сталкивались с массивами в предудыщих лабораторных, когда использовали строковый метод str.split :

>>> s = "ab cd ef1 2 301" >>> s.split() ['ab', 'cd', 'ef1', '2', '301'] 

Т.е. str.split , по умолчанию, разбивает строку по символам пустого пространства (пробел, табуляция) и создаёт массив из получившихся «слов».

Загляните в help(str.split) , чтобы узнать, как изменить такое поведение, и разбивать строку, например, по запятым, что является стандартом для представления таблиц в файлах csv (comma separated values).

Методом, являющимся обратным к операции str.split является str.join . Он «собирает» строку из массива строк:

>>> s 'ab cd ef1 2 301' >>> l = s.split() >>> l ['ab', 'cd', 'ef1', '2', '301'] >>> l[-1] = '430' >>> l ['ab', 'cd', 'ef1', '2', '430'] >>> ','.join(l) 'ab,cd,ef1,2,430' >>> ' -- '.join(l) 'ab -- cd -- ef1 -- 2 -- 430' 

Работа с двумерными массивами

Как вам рассказали, в массиве мы можем хранить различные данные. В том числе в ячейке массива можем хранить другой массив. Давайте предположим, что в каждой ячейке массива размера N у нас будет храниться другой массив размера M . Таким образом мы можем построить таблицу или матрицу размера N x M .

Создание двумерного массива (матрицы) размера N x M в питоне:

a = [] for _ in range(n): a.append([0] * m) 
a = [[0] * m for _ in range(n)] 

Обращение к элементами двумерного массива:

a[i][j] = 5 

Массивы

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

Общее представление о массиве

Массив (в питоне еще принято название «список», это то же самое) — это переменная, в которой хранится много значений. Массив можно представлять себе в виде такой последовательности ячеек, в каждой из которых записано какое-то число:

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

a = [7, 5, -3, 12, 2, 0]

Теперь переменная a хранит этот массив. К элементам массива можно обращаться тоже через квадратные скобки: a[2] — это элемент номер 2, т.е. в нашем случае это -3 . Аналогично, a[5] — это 0. В квадратных скобках можно использовать любые арифметические выражения и даже другие переменные: a[2*2-1] — это 12, a[i] обозначает «возьми элемент с номером, равным значению переменной i «, аналогично a[2*i+1] обозначает «возьми элемент с номером, равным 2*i+1», или даже a[a[4]] обозначает «возьми элемент с номером, равным четвертому элементу нашего массива» (в нашем примере a[4] — это 2 , поэтому a[a[4]] — это a[2] , т.е. -3 ).

Если указанный номер слишком большой (больше длины массива), то питон выдаст ошибку (т.е. в примере выше a[100] будет ошибкой, да и даже a[6] тоже). Если указан отрицательный номер, то тут действует хитрое правило. Отрицательные номера обозначают нумерацию массива с конца: a[-1] — это всегда последний элемент, a[-2] — предпоследний и т.д. В нашем примере a[-6] равно 7. Слишком большой отрицательный номер тоже дает ошибку (в нашем примере a[-7] уже ошибка).

С элементами массива можно работать как с привычными вам переменными. Можно им присваивать значения: a[3] = 10 , считывать с клавиатуры: a[3] = int(input()) , выводить на экран: print(a[3]) , использовать в выражениях: a[3+i*a[2]] = 3+abs(a[1]-a[0]*2+i) (здесь i — какая-то еще целочисленная переменная для примера), использовать в if’ах: if a[i]>a[i-2]: , или for a[2] in range(i) и т.д. Везде, где вы раньше использовали переменные, можно теперь использовать элемент массива.

Обход массива

Но обычно вам надо работать сразу со всеми элементами массива. Точнее, сразу со всеми как правило не надо, надо по очереди с каждым (говорят: «пробежаться по массиву»). Для этого вам очень полезная вещь — это цикл for . Если вы знаете, что в массиве n элементов (т.е. если у вас есть переменная n и в ней хранится число элементов в массиве), то это делается так:

for i in range(n): . что-то сделать с элементом a[i]

например, вывести все элементы массива на экран:

for i in range(n): print(a[i])

или увеличить все элементы массива на единицу:

for i in range(n): a[i] += 1

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

Если же у вас нет переменной n , то вы всегда можете воспользоваться специальной функцией len , которая возвращает количество элементов в массиве:

for i in range(len(a)): .

Функцию len , конечно, можно использовать где угодно, не только в заголовке цикла. Например, просто вывести длину массива — print(len(a)) .

Операции на массиве

Еще ряд полезных операций с массивами:

  • a[i] (на всякий случай повторю, чтобы было легче найти) — элемент массива с номером i .
  • len(a) (на всякий случай повторю, чтобы было легче найти) — длина массива.
  • a.append(x) — приписывает к массиву новый элемент со значением x , в результате длина массива становится на 1 больше. Конечно, вместо x может быть любое арифметическое выражение.
  • a.pop() — симметричная операция, удаляет последний элемент из массива. Длина массива становится на 1 меньше. Если нужно запомнить значение удаленного элемента, надо просто сохранить результат вызова pop в новую переменную: res = a.pop() .
  • a * 3 — это массив, полученный приписыванием массива a самого к себе три раза. Например, [1, 2, 3] * 3 — это [1, 2, 3, 1, 2, 3, 1, 2, 3] . Конечно, на месте тройки тут может быть любое арифметическое выражение. Самое частое применение этой конструкции — если вам нужен массив длины n , заполненный, например, нулями, то вы пишете [0] * n .
  • b = a — присваивание массивов. Теперь в b записан тот же массив, что и в a . Тот же — в прямом смысле слова: теперь и a , и b соответствуют одному и тому же массиву, и изменения в b отразятся в a и наоборот. Еще раз, потому что это очень важно. Присваивание массивов (и вообще любых сложных объектов) в питоне не копирует массив, а просто обе переменные начинают ссылаться на один и тот же массив, и изменения массива через любую из них меняет один и тот же массив. При этом на самом деле тут есть многие тонкости, просто будьте готовы к неожиданностям.
  • b = a[1:4] («срез») — делает новый массив, состоящий из элементов старого массива начиная со первого (помните про нумерацию с нуля!) и заканчивая третьим (т.е. до четвертого, но не включительно, аналогично тому, как работает range ); этот массив сохраняется в b . Для примера выше получится [5, -3, 12] . Конечно, на месте 1 и 4 может быть любое арифметическое выражение. Более того, эти индексы можно вообще не писать, при этом автоматически подразумевается начало и конец массива. Например, a[:3] — это первые три элемента массива (нулевой, первый и второй), a[1:] — все элементы кроме нулевого, a[:-1] — все элементы кроме последнего (!), а a[:] — это копия всего массива. И это именно копия, т.е. запись b = a[:] именно копирует массив, получающиеся массивы никак не связаны, и изменения в b не влияют на a (в отличие от b = a ).

Ввод-вывод массива

Как вам считывать массив? Во-первых, если все элементы массива задаются в одной строке входного файла. Тогда есть два способа. Первый — длинный, но довольно понятный:

a = input().split() # считали строку и разбили ее по пробелам # получился уже массив, но питон пока не понимает, что в массиве числа for i in range(len(a)): a[i] = int(a[i]) # прошли по всем элементам массива и превратили их в числа

Второй — покороче, но попахивает магией:

a = list(map(int, input().split()))

Может показаться страшно, но на самом деле map(int, input().split()) вы уже встречали в конструкции

x, y = map(int, input().split())

когда вам надо было считать два числа из одной строки. Это считывает строку ( input() ), разбивает по пробелам ( .split() ), и превращает каждую строку в число ( map(int, . ) ). Для чтения массива все то же самое, только вы еще заворачиваете все это в list(. ) , чтобы явно сказать питону, что это массив.

Какой из этих двух способов использовать для чтения данных из одной строки — выбирать вам.

Обратите внимание, что в обоих способах вам не надо знать заранее, сколько элементов будет в массиве — получится столько, сколько чисел в строке. В задачах часто бывает что задается сначала количество элементов, а потом (обычно на следующей строке) сами элементы. Это удобно в паскале, c++ и т.п., где нет способа легко считать числа до конца строки; в питоне вам это не надо, вы легко считываете сразу все элементы массива до конца строки, поэтому заданное число элементов вы считываете, но дальше не используете:

n = int(input()) # больше n не используем a = list(map(int, input().split()))

Еще бывает, что числа для массива задаются по одному в строке. Тогда вам проще всего заранее знать, сколько будет вводиться чисел. Обычно как раз так данные и даются: сначала количество элементов, потом сами элементы. Тогда все вводится легко:

n = int(input()) a = [] # пустой массив, т.е. массив длины 0 for i in range(n): a.append(int(input())) # считали число и сразу добавили в конец массива

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

Как выводить массив? Если надо по одному числу в строку, то просто:

for i in range(len(a)): print(a[i])

Если же надо все числа в одну строку, то есть два способа. Во-первых, можно команде print передать специальный параметр end=» » , который обозначает «заканчивать вывод пробелом (а не переводом строки)»:

for i in range(len(a)): print(a[i], end=" ")

Есть другой, более простой способ:

print(*a)

Эта магия обозначает вот что: возьми все элементы массива a и передай их отдельными аргументами в одну команду print . Т.е. получается print(a[0], a[1], a[2], . ) .

Двумерные массивы

Выше везде элементами массива были числа. Но на самом деле элементами массива может быть что угодно, в том числе другие массивы. Пример:

a = [10, 20, 30] b = [-1, -2, -3] c = [100, 200] z = [a, b, c]

Что здесь происходит? Создаются три обычных массива a , b и c , а потом создается массив z , элементами которого являются как раз массивы a , b и c .

Что теперь получается? Например, z[1] — это элемент №1 массива z , т.е. b . Но b — это тоже массив, поэтому я могу написать z[1][2] — это то же самое, что b[2] , т.е. -3 (не забывайте, что нумерация элементов массива идет с нуля). Аналогично, z[0][2]==30 и т.д.

То же самое можно было записать проще:

z = [[10, 20, 30], [-1, -2, -3], [100, 200]]

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

z содержит три элемента, и не важно, что каждый из них тоже массив), а len(z[2]) — длина внутреннего массива на позиции 2 (т.е. 2 в примере выше). Для массива x выше (того, у которого каждый подмассив имеет свою длину) получим len(x)==5 , и, например, len(x[3])==0 .

Аналогично работают все остальные операции. z.append([1,2]) приписывает к «внешнему» массиву еще один «внутренний» массив, а z[2].append(3) приписывает число 3 к тому «внутреннему» массиву, который находится на позиции 2. Далее, z.pop() удаляет последний «внутренний» из «внешнего» массива, а z[2].pop() удаляет последний элемент из «внутреннего» массива на позиции 2. Аналогично работают z[1:2] и z[1][0:1] и т.д. — все операции, которые я приводил выше.

Обход двумерного массива

Конечно, чтобы обойти двумерный массив, надо обойти каждый его «внутренний» массив. Чтобы обойти внутренний массив, нужен цикл for , и еще один for нужен, чтобы перебрать все внутренние массивы:

for i in range(len(z)): # будем теперь обходить массив z[i] for j in range(len(z[i])): . что-то сделаем с элементом z[i][j]

Создание пустого массива

Неожиданно нетривиальная операция на двумерных массивах — это создание двумерного массива определенного размера, заполненного, например, нулями. Вы помните, что одномерный массив длины n можно создавать как [0] * n . Возникает желание написать a = ([0] * m) * n , чтобы создать двумерный массив размера n x m (мы хотим, чтобы первый индекс массива менялся от 0 до n-1 , а второй индекс до m-1 , поэтому это именно ([0] * m) * n , а не ([0] * n) * m ). Но это сработает не так, как вы можете думать. Дело опять в том, что в питоне массивы по умолчанию не копируются полностью, поэтому то, что получается — это массив длина n , в котором каждый элемент соответствует одному и тому же массиву длины n . В итоге, если вы будете менять, например, a[1][2] , то так же будет меняться и a[0][2] , и a[3][2] и т.д. — т.к. все внутренние массивы на самом деле соответствуют одному и тому же массиву.

Поэтому массив размера n x m делается, например, так:

a = [] for i in range(n): a.append([0] * m)

мы вручную n раз приписали к массиву a один и тот же массив.

Или еще есть магия в одну строчку:

a = [[0] * m for i in range(n)]

Я пока не буду объяснять, как это работает, просто можете запомнить. Или пользоваться предыдущим вариантом.

Обратите внимание, что тут важный момент — хотим мы, чтобы n соответствовало первому индексу или второму. В примерах выше n — размер первого индекса (т.е. размер «внешнего» массива), a m — размер второго индекса (т.е. размер каждого «внутреннего» массива). Если вы хотите, то можно делать и наоборот, но это вы сами должны решить и делать согласованно во всей программе.

Ввод-вывод двумерного массива

Обычно двумерный массив вам задается как n строк по m чисел в каждой, причем числа n и m вам задаются заранее. Такой двумерный массив вводится эдакой комбинацией двух способов ввода одномерного массива, про которые я писал выше:

n, m = map(int, input().split()) # считали n и m из одной строки # m дальше не будет нужно a = [] for i in range(n): a.append(list(map(int, input().split())))

Мы считываем очередную строку и получаем очередной «внутренний» массив: list(map(int, input().split())) , и приписываем его ( append ) ко внешнему массиву.

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

Вывод двумерного массива, если вам его надо вывести такой же табличкой, тоже делается комбинацией способов вывода одномерного массива, например, так:

for i in range(len(a)): print(*a[i])
for i in range(len(a)): for j in range(len(a[i])): print(a[i][j], end=" ") print() # сделать перевод строки

Многомерные массивы

Аналогично двумерным, бывают и трехмерные и т.д. массивы. Просто каждый элемент «внутреннего» массива теперь сам будет массивом:

a = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

Здесь a[0] — это двумерный массив [[1, 2], [3, 4]] , и a[1] — двумерный массив [[5, 6], [7, 8]] . Например, a[1][0][1] == 6 .

Многомерные массивы в простых задачах не нужны, но на самом деле бывают полезны и не представляют из себя чего-то особо сложного. С ними все аналогично тому, что мы обсуждали про двумерные массивы.

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

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