Как создать Матрицу через итерацию в Python - PullRequest
0 голосов
/ 18 июля 2011

Я хочу создать (3n * 7) Матрицу в python через Итерацию, я сделал это в VB.Net, и это сработало, но это дает мне некоторые трудности в Python, так как это новый язык для меня. n может быть числом итераций для построения матрицы, т.е. если вы повторили 3 раза, матрица будет 9 * 7. Вот как я это сделал в VB.Net. :

'Assign some values to the A matrix
A_mat(p, 0) = 1 : A_mat(1 + p, 1) = 1 : A_mat(2 + p, 2) = 1 'row/column 1,2 & 3 data
A_mat(p, 3) = c : A_mat(p, 4) = 0 : A_mat(p, 5) = a : A_mat(p, 6) = b 'row 1 data
A_mat(1 + p, 3) = g : A_mat(1 + p, 4) = d : A_mat(1 + p, 5) = t : A_mat(1 + p, 6) = f 'row 2 data
A_mat(2 + p, 3) = m : A_mat(2 + p, 4) = h : A_mat(2 + p, 5) = u : A_mat(2 + p, 6) = k 'row 3 data

this yielded: 
1     0    0   c   0   a   b 
0     1    0   g   d   t   f
0     0    1   m   h   u   k
.     .
.          .
.              .   

Ответы [ 3 ]

3 голосов
/ 18 июля 2011

Одним из решений является использование numpy ( скачать здесь ) matrix:

>>> from numpy import zeros, matrix
>>> n = 2
>>> mat = matrix(zeros([3*n, 7]))
>>> mat
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.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0.,  0.]])

Однако, как отмечалось выше @joris, с пустой матрицей все ваши данные должны быть одного типа.

>>> mat[0,2] = 14
>>> mat
matrix([[  0.,   0.,  14.,   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.],
        [  0.,   0.,   0.,   0.,   0.,   0.,   0.],
        [  0.,   0.,   0.,   0.,   0.,   0.,   0.]])
>>> mat[0,1] = 's'

Traceback (most recent call last):
  File "<pyshell#139>", line 1, in <module>
    mat[0,1] = 's'
ValueError: could not convert string to float: s

Вы, вероятно, хотите использовать вместо этого вложенный list, поскольку это гораздо более гибкий и универсальный тип данных, и к тому же его легче освоить. Для этого я бы направил вас на этот вопрос , поскольку @Mike Graham правильно объяснил их. Возможно, вы захотите определить метод как:

def shape_zeros(n):
    # Here's where you build up your "matrix"-style nested list
    pass # The pass statement does nothing!

Вот несколько советов по заполнению тела кода вышеупомянутой функции. Во-первых, вы можете создать целый список дубликатов с помощью оператора *:

>>> row = [0] * 7
>>> row
[0, 0, 0, 0, 0, 0, 0]

Далее вы можете вкладывать списки в списки; но будьте осторожны при перемещении списков, так как имя списка фактически похоже на указатель:

>>> mat = []
>>> n = 2
>>> for i in range(n*3):
    mat.append(row)

>>> mat
[[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, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0]]
>>> mat[0][0] = 1
>>> mat
[[1, 0, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0],
 [1, 0, 0, 0, 0, 0, 0]]

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

>>> mat[0][0] = 1
>>> mat[1][2] = 'Q_Q'
>>> mat[2][0] = 3
>>> mat[2][2] = 5
>>> mat
[[1, 0, 0, 0, 0, 0, 0],
 [0, 0, 'Q_Q', 0, 0, 0, 0],
 [3, 0, 5, 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]]

Удачи!

1 голос
/ 18 июля 2011

Ваш вопрос помечен Numpy, поэтому здесь он находится в форме, которая позволяет превратить его в матрицу Numpy.

from numpy import matrix

repeat = 3
width = 7
rows_per_iteration = 3

# The 1st row is also the 4th and 7th, the 2nd is also the 5th and 8th, etc.
A = [[0] * width for Null in range(rows_per_iteration)] * repeat

A[0][0] = 1
A[1][1] = 1
A[2][2] = 1
A[0][3] = 'c'
A[0][4] = 0
A[0][5] = 'a'
A[0][6] = 'b'
A[1][3] = 'g'
A[1][4] = 'd'
A[1][5] = 't'
A[1][6] = 'f'
A[2][3] = 'm'
A[2][4] = 'h'
A[2][5] = 'u'
A[2][6] = 'k'

A_mat = matrix(A)

Если вы собираетесь использовать их без перехода к матрице,

repeat = 3
width = 7
rows_per_iteration = 3
total_rows = repeat * rows_per_iteration

A = [[0] * width for Null in range(total_rows)]

for np in range(0, total_rows, rows_per_iteration):
    A[np][0] = 1
    A[1 + np][1] = 1
    A[2 + np][2] = 1
    A[np][3] = 'c'
    A[np][4] = 0
    A[np][5] = 'a'
    A[np][6] = 'b'
    A[1 + np][3] = 'g'
    A[1 + np][4] = 'd'
    A[1 + np][5] = 't'
    A[1 + np][6] = 'f'
    A[2 + np][3] = 'm'
    A[2 + np][4] = 'h'
    A[2 + np][5] = 'u'
    A[2 + np][6] = 'k'

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

1 голос
/ 18 июля 2011
In [13]: [[0]*8 for el in range(8)]
Out[13]: 
[[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, 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, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0]]

или аналогично

In [21]: [[a for a in range(el*8,(el+1)*8)] for el in range(8)]
Out[21]: 
[[0, 1, 2, 3, 4, 5, 6, 7],
 [8, 9, 10, 11, 12, 13, 14, 15],
 [16, 17, 18, 19, 20, 21, 22, 23],
 [24, 25, 26, 27, 28, 29, 30, 31],
 [32, 33, 34, 35, 36, 37, 38, 39],
 [40, 41, 42, 43, 44, 45, 46, 47],
 [48, 49, 50, 51, 52, 53, 54, 55],
 [56, 57, 58, 59, 60, 61, 62, 63]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...