Я хочу определить двумерный массив без инициализированной длины следующим образом:
Matrix = [][]
но это не работает...
Я'пробовал код ниже, но он тоже неправильный:
Matrix = [5][5]
Ошибка:
Traceback ...
IndexError: list index out of range
В чем моя ошибка?
Технически вы пытаетесь индексировать неинициализированный массив. Вы должны сначала инициализировать внешний список списками перед добавлением элементов; в Python это называется "осмысление списка".
# Creates a list containing 5 lists, each of 8 items, all set to 0
w, h = 8, 5;
Matrix = [[0 for x in range(w)] for y in range(h)]
Matrix[0][0] = 1
Matrix[6][0] = 3 # error! range...
Matrix[0][6] = 3 # valid
Обратите внимание, что матрица является "y" адресной, другими словами, "y-индекс" идет перед "x-индексом".
print Matrix[0][0] # prints 1
x, y = 0, 6
print Matrix[x][y] # prints 3; be careful with indexing!
Хотя вы можете называть их как угодно, я смотрю на это так, чтобы избежать путаницы, которая может возникнуть с индексацией, если вы используете "x" для внутреннего и внешнего списков, и хотите получить неквадратную матрицу.
Если вы действительно хотите матрицу, вы могли бы быть лучше, используя включает в себя
. Матричные операции в пакете numpyчаще всего использовать тип массива с двумя измерениями. Есть много способов, чтобы создать новый массив; один из наиболее полезных является функция
нули`, который принимает параметр формы и возвращает массив заданной формы, со значениями инициализируются к нулю:
>>> import numpy
>>> numpy.zeros((5, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
включает
предоставляет матрица
типа. Это's меньше, обычно используется, и некоторые люди рекомендуем с помощью его. Но это's полезный для людей, приезжающих в включает в себя
из MATLAB, а в некоторых других контекстах. Я думал, что я'd, включает его, так как мы're говоря о матрицах!
>>> numpy.matrix([[1, 2], [3, 4]])
matrix([[1, 2],
[3, 4]])
Вот некоторые другие способы, чтобы создать 2-мерные массивы и матрицы (с выхода снимаются для компактности):
numpy.matrix('1 2; 3 4') # use Matlab-style syntax
numpy.arange(25).reshape((5, 5)) # create a 1-d range and reshape
numpy.array(range(25)).reshape((5, 5)) # pass a Python range and reshape
numpy.array([5] * 25).reshape((5, 5)) # pass a Python list and reshape
numpy.empty((5, 5)) # allocate, but don't initialize
numpy.ones((5, 5)) # initialize with ones
numpy.ndarray((5, 5)) # use the low-level constructor
Вот короче нотации для инициализации списка списков:
matrix = [[0]*5 for i in range(5)]
К сожалению укорочение это что-то вроде5*[5*[0]]
Не'т действительно работать, потому что вы в конечном итоге с 5 экземпляров на тот же список, так что при изменении одного из них все изменения, например:
>>> matrix = 5*[5*[0]]
>>> matrix
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> matrix[4][4] = 2
>>> matrix
[[0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2], [0, 0, 0, 0, 2]]
Если все вы хотите, это двумерный контейнер для хранения некоторых элементов, вы можете легко использовать вместо словаря:
Matrix = {}
Тогда вы можете сделать:
Matrix[1,2] = 15
print Matrix[1,2]
Это работает, потому что 1,2
кортеж, и вы're, используя его в качестве ключа для индексирования словаря. Результат похож на тупой разреженных матриц.
Как указано Оса и Josap Вальс, вы также можете использовать Матрица = коллекциях.defaultdict(лямбда:0) так что недостающие элементы имеют значение по умолчанию
0`.
Вацал далее указывает, что этот метод, вероятно, является не очень эффективным для больших матриц и должны использоваться только в не критичные к производительности части кода.
В Python вы будете создавать список списков. Вам не нужно декларировать размеры загодя, но вы можете. Например:
matrix = []
matrix.append([])
matrix.append([])
matrix[0].append(2)
matrix[1].append(3)
Теперь матрица[0][0] == 2 и матрица[1][0] == 3. Вы также можете использовать список понимание синтаксиса. Этот пример использует его дважды, чтобы создать и"двумерный список и":
from itertools import count, takewhile
matrix = [[i for i in takewhile(lambda j: j < (k+1) * 10, count(k*10))] for k in range(10)]
Вы должны составить список списков, и лучший способ - использовать вложенные понимания:
>>> matrix = [[0 for i in range(5)] for j in range(5)]
>>> pprint.pprint(matrix)
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
В вашем примере [5][5]
вы создаете список с целым числом "5" внутри, и пытаетесь получить доступ к его 5-му элементу, что, естественно, вызывает ошибку IndexError, поскольку пятого элемента не существует:
>>> l = [5]
>>> l[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
rows = int(input())
cols = int(input())
matrix = []
for i in range(rows):
row = []
for j in range(cols):
row.append(0)
matrix.append(row)
print(matrix)
Зачем такой длинный код, что тоже в Питон
, спросите вы?
Давно, когда мне было не комфортно с Python, я увидел одну строку ответы для написания 2Д матрицу и сказал себе, что я не буду использовать снова 2-й матрицы в Python. (Эти линии были довольно страшно, и ничего'т дать мне никаких сведений о том, что питон делает. Также обратите внимание, что я не в курсе этих shorthands.)
В любом случае, здесь'ы код для новичка, чьи ближайшие от c, cpp и Java в фоне
Обратите внимание на Python любителей и экспертов: пожалуйста, не вниз голосовать только потому, что я написал подробный код.
Объявить матрицу из нулей (единиц):
numpy.zeros((x, y))
например
>>> numpy.zeros((3, 5))
array([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
или и NumPy.(в(Х, г)) например
>>> np.ones((3, 5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
Даже трех размеров. (http://www.astro.ufl.edu/~warner/prog/python.html смотри --> многомерные массивы)
Рерайт для легкого чтения:
# 2D array/ matrix
# 5 rows, 5 cols
rows_count = 5
cols_count = 5
# create
# creation looks reverse
# create an array of "cols_count" cols, for each of the "rows_count" rows
# all elements are initialized to 0
two_d_array = [[0 for j in range(cols_count)] for i in range(rows_count)]
# index is from 0 to 4
# for both rows & cols
# since 5 rows, 5 cols
# use
two_d_array[0][0] = 1
print two_d_array[0][0] # prints 1 # 1st row, 1st col (top-left element of matrix)
two_d_array[1][0] = 2
print two_d_array[1][0] # prints 2 # 2nd row, 1st col
two_d_array[1][4] = 3
print two_d_array[1][4] # prints 3 # 2nd row, last col
two_d_array[4][4] = 4
print two_d_array[4][4] # prints 4 # last row, last col (right, bottom element of matrix)
Я'м на мой первый скрипт на Python, и я был на примере квадратной матрицы немного смущен, поэтому я надеюсь, что приведенный ниже пример поможет вам сэкономить время:
# Creates a 2 x 5 matrix
Matrix = [[0 for y in xrange(5)] for x in xrange(2)]
так что
Matrix[1][4] = 2 # Valid
Matrix[4][1] = 3 # IndexError: list index out of range
Это, как я обычно создавать 2D массивы в Python.
col = 3
row = 4
array = [[0] * col for _ in range(row)]
Я нахожу этот синтаксис легко запомнить по сравнению с помощью двух циклов for в список понимания.
Используя numpy строки можно инициализировать пустой матрицы, как это:
import numpy as np
mm = np.matrix([])
А позже добавлять такие данные:
mm = np.append(mm, [[1,2]], axis=1)
Если вы хотите быть в состоянии думать, это как 2D-массив, а не вынужден думать в перспективе список списков (гораздо более естественно на мой взгляд), вы можете сделать следующее:
import numpy
Nx=3; Ny=4
my2Dlist= numpy.zeros((Nx,Ny)).tolist()
Результатом является список (не массив NumPy), и вы можете перезаписать отдельных позиций с числами, строками, что угодно.
matrix = {}
Вы можете определить ключи и значения двумя способами:
matrix[0,0] = value
или
matrix = { (0,0) : value }
Результат:
[ value, value, value, value, value],
[ value, value, value, value, value],
...
Использование:
import copy
def ndlist(*args, init=0):
dp = init
for x in reversed(args):
dp = [copy.deepcopy(dp) for _ in range(x)]
return dp
l = ndlist(1,2,3,4) # 4 dimensional list initialized with 0's
l[0][1][2][3] = 1
Я думаю, что и NumPy путь. Вышесказанное является общим, если вы не'т хотите использовать NumPy и обратно.
Если вы Don'т иметь информацию о размере, прежде чем начать затем создать два одномерных списков.
список 1: для хранения строк список 2: фактическое двумерной матрицы
Хранить всю строку в 1-й список. После этого, добавить в список 1 и в список 2:
from random import randint
coordinates=[]
temp=[]
points=int(raw_input("Enter No Of Coordinates >"))
for i in range(0,points):
randomx=randint(0,1000)
randomy=randint(0,1000)
temp=[]
temp.append(randomx)
temp.append(randomy)
coordinates.append(temp)
print coordinates
Выход:
Enter No Of Coordinates >4
[[522, 96], [378, 276], [349, 741], [238, 439]]