Добавить несколько массивов в Python - PullRequest
0 голосов
/ 30 марта 2020

То, что я создал до сих пор

Я создал квадратную матрицу из нулей 18x18 под названием 'master_matrix'.

Я создал массив с именем ingreso_datos , чей столбец 0 [столбец 0] указывает на метку данных .

Я создал для l oop где:

Для каждого метка данных У меня будет little_matrix , значения которого будут присвоены master_matrix в соответствующих им строках и столбцах. Поскольку это происходит внутри для l oop, для этого примера я получаю 6 master_matrix (в моем списке переменных читается только последняя, ​​то есть шестая master_matrix ).

Что мне нужно сделать

Что я сейчас ищу, так это добавить 6 master_matrix , которые получены из для l oop.

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

import numpy as np

Я создал квадратную матрицу из нулей 18x18 с именем 'master_matrix'

 master_matrix = np.zeros((18, 18))

Я создал массив с именем 'ingreso_datos', столбец которого 0 [столбец 0] указывает метку данных.

#              Data label  |-------1(i)       2(i)       3(i)        1(j)      2(j)        3(j) --|
#               [Col0]     |------[Col1]     [Col2]     [Col3]      [Col4]    [Col5]      [Col6] --|

ingreso_datos = [[ 1,              13,       14,          15,          7,        8,          9],
                 [ 2,              16,       17,          18,         10,       11,       12],
                 [ 3,               7,        8,           9,          1,        2,        3],
                 [ 4,              10,       11,          12,          4,        5,        6],
                 [ 5,               7,        8,           9,         10,       11,         12],
                 [ 6,               1,        2,           3,          4,        5,        6]]

Для каждой метки данных у меня будет 'little_matrix', значения которого будут назначены 'master_matrix' в соответствующих им строках и столбцах. Поскольку это происходит внутри для l oop, для этого примера я получаю 6 'master_matrix' (в моем списке переменных читается только последний, то есть шестой 'master_matrix').

indices = []     # moved outside of the loop 
for i in range(len(ingreso_datos)):
    indices.append([ingreso_datos[i][0], ingreso_datos[i][1], ingreso_datos[i][2], ingreso_datos[i][3],
                    ingreso_datos[i][4], ingreso_datos[i][5], ingreso_datos[i][6]])   

for row in indices:
    indices = np.array(row[1:])
    indices -= 1

    d = 5
    s = 0.2          
    e = 0.05            
    y = 5000000           

    little_matrix = np.array([[ s*y/d,           0,           0,    -s*y/d,            0,           0],
                              [     0,    y*e/d**3,    y*e/d**2,         0,    -y*e/d**3,    y*e/d**2],
                              [     0,    y*e/d**2,       y*e/d,         0,    -y*e/d**2,       y*e/d],
                              [-s*y/d,           0,           0,     s*y/d,            0,           0],
                              [     0,    y*e/d**3,   -y*e/d**2,         0,     y*e/d**3,   -y*e/d**2],
                              [     0,    y*e/d**2,       y*e/d,         0,    -y*e/d**2,       y*e/d]])

    master_matrix[np.ix_(indices, indices)] = little_matrix

То, что я сейчас ищу, это добавить 6 master_matrix, которые берутся для l oop.

    master_matrix.sum()

1 Ответ

0 голосов
/ 31 марта 2020
In [68]: ingreso_datos = np.array([[ 1,              13,       14,          15,          7,    
    ...:     8,          9], 
    ...:                  [ 2,              16,       17,          18,         10,       11,   
    ...:     12], 
    ...:                  [ 3,               7,        8,           9,          1,        2,   
    ...:      3], 
    ...:                  [ 4,              10,       11,          12,          4,        5,   
    ...:      6], 
    ...:                  [ 5,               7,        8,           9,         10,       11,   
    ...:       12], 
    ...:                  [ 6,               1,        2,           3,          4,        5,   
    ...:      6]])                                                                             
In [69]: ingreso_datos.shape                                                                   
Out[69]: (6, 7)

Что indices создание не делает ничего существенного:

In [70]: indices = []     # moved outside of the loop  
    ...: for i in range(len(ingreso_datos)): 
    ...:     indices.append([ingreso_datos[i][0], ingreso_datos[i][1], ingreso_datos[i][2], ing
    ...: reso_datos[i][3], 
    ...:                     ingreso_datos[i][4], ingreso_datos[i][5], ingreso_datos[i][6]])   
    ...:  
    ...:                                                                                       
In [71]: np.array(indices).shape                                                               
Out[71]: (6, 7)
In [72]: np.allclose(ingreso_datos, np.array(indices))                                         
Out[72]: True

little_matrix не обязательно должно быть в l oop, так как оно не меняется:

In [74]: little_matrix                                                                         
Out[74]: 
array([[ 200000.,       0.,       0., -200000.,       0.,       0.],
       [      0.,    2000.,   10000.,       0.,   -2000.,   10000.],
       [      0.,   10000.,   50000.,       0.,  -10000.,   50000.],
       [-200000.,       0.,       0.,  200000.,       0.,       0.],
       [      0.,    2000.,  -10000.,       0.,    2000.,  -10000.],
       [      0.,   10000.,   50000.,       0.,  -10000.,   50000.]])

Что касается вашей итерации на row:

In [75]: np.array(indices[0][1:])-1                                                            
Out[75]: array([12, 13, 14,  6,  7,  8])
In [77]: ingreso_datos[0,1:]-1                                                                 
Out[77]: array([12, 13, 14,  6,  7,  8])

Итак, ваше итеративное присвоение master_matrix становится:

In [78]: master_matrix=np.zeros((18,18)) 
In [80]: for row in ingreso_datos: 
    ...:     indices = row[1:]-1 
    ...:     master_matrix[np.ix_(indices,indices)]=little_matrix 
    ...:                                                                                       
In [81]: master_matrix                                                                         
Out[81]: 
array([[ 200000.,       0.,       0., -200000.,       0.,       0.,
        -200000.,       0.,       0.,       0.,       0.,       0.,
              0.,       0.,       0.,       0.,       0.,       0.],
       [      0.,    2000.,   10000.,       0.,   -2000.,   10000.,
              0.,    2000.,  -10000.,       0.,       0.,       0.,
              0.,       0.,       0.,       0.,       0.,       0.],
       ...

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

Рассматривая индексы в целом:

In [88]: x = ingreso_datos[:,1:]-1                                                             
In [89]: x                                                                                     
Out[89]: 
array([[12, 13, 14,  6,  7,  8],
       [15, 16, 17,  9, 10, 11],
       [ 6,  7,  8,  0,  1,  2],
       [ 9, 10, 11,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [ 0,  1,  2,  3,  4,  5]])

Я вижу некоторое совпадение. Например, последняя строка над записью записывает некоторые значения, записанные в строке 2:

In [90]: master_matrix[:6,:6]                                                                  
Out[90]: 
array([[ 200000.,       0.,       0., -200000.,       0.,       0.],
       [      0.,    2000.,   10000.,       0.,   -2000.,   10000.],
       [      0.,   10000.,   50000.,       0.,  -10000.,   50000.],
       [-200000.,       0.,       0.,  200000.,       0.,       0.],
       [      0.,    2000.,  -10000.,       0.,    2000.,  -10000.],
       [      0.,   10000.,   50000.,       0.,  -10000.,   50000.]])
In [91]: master_matrix[np.ix_(x[2],x[2])]                                                      
Out[91]: 
array([[ 200000.,       0.,       0., -200000.,       0.,       0.],
       [      0.,    2000.,   10000.,       0.,   -2000.,   10000.],
       [      0.,   10000.,   50000.,       0.,  -10000.,   50000.],
       [-200000.,       0.,       0.,  200000.,       0.,       0.],
       [      0.,    2000.,  -10000.,       0.,    2000.,   10000.],
       [      0.,   10000.,   50000.,       0.,   10000.,   50000.]])

(обратите внимание на изменение знака в правом нижнем углу).

Учитывая, что на круге невозможно повторить итеративное назначение одним вызовом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...