Индексировать значения для вектора с numpy in python - PullRequest
0 голосов
/ 04 апреля 2020

Я создал вектор нулей с именем Qc_vector (18 строк x 1 столбец).

Я создал еще один вектор с именем s_vector (6 строк x 1) столбец), который каждый раз генерируется для l oop в диапазоне ingreso_datos , то есть для этого примера он генерируется 5 раз.

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

ПРОБЛЕМА

При попытке сделать это я получаю следующую ошибку: ValueError: несоответствие формы: массив значений формы (6,) не может быть передан для индексации результата формы (6,1)

Для элемента 6 матрицы ingreso_datos индексы составляют: [1,2,3, 4,5,6]

Для конца l oop, то есть для элемента с номером 5 s_vector это выглядит так:

s_vector для элемента 5

Qc_vector проиндексирован, как он должен выглядеть

import numpy as np

#            Element   1(i)   2(i)   3(i)   1(j)   2(j)    3(j)    x(i)    y(i)    x(j)    y(j)  | W(kg/m)   Axis(kg/m)
#             [Col0]  [Col1] [Col2] [Col3] [Col4] [Col5]  [Col6]  [Col7]  [Col8] [Col9]  [Col10] | [Col11]   [Col12]

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


Qc_vector = np.zeros((12,1))       # Vector de zeros 

for i in range(len(ingreso_datos)): 

    indices = [] 
    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:])

    L = np.sqrt((ingreso_datos[i][9]-ingreso_datos[i][7])**2+(ingreso_datos[i][10]-ingreso_datos[i][8])**2)
    lx = (ingreso_datos[i][9]-ingreso_datos[i][7])/L
    ly = (ingreso_datos[i][10]-ingreso_datos[i][8])/L            
    w = ingreso_datos[i][11]
    ad = ingreso_datos[i][12]

    s_vector = np.array([ad*L/2,    w*L/2,   (w*L**2)/12,   ad*L/2,     w*L/2,   (-w*L**2)/12])    # s_vector


    Qc_vector[np.ix_(indices)] = s_vector # Indexing 

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Qc_vector - это (18,1).

indices = [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]])   

или просто:

indices = [ingreso_datos[i,[0,1,2,3,4,5,6]]]

, за которым следует:

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

, что просто

ingreso_datos[i,[1,2,3,4,5,6]]

s_vector - это массив из 6 элементов, форма (6,)

In:

Qc_vector[np.ix_(indices)] = s_vector 

вам не нужно ix_. В моем предыдущем ответе я предложил:

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

как способ индексации всех строк, а не только одной.

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

Qc_vector[indices, 0] = s_vector 

Таким образом, массив shape (6,) с обеих сторон.

У меня такое ощущение, что вы все еще пытаетесь написать этот код, копируя код других людей, не понимая, что происходит или почему они предлагают вещи.


или определите Qc_vector с формой (18,), а не (18,1).

0 голосов
/ 04 апреля 2020

Быстрое исправление, если вы не хотите слишком много беспокоиться, это использовать numpy .reshape () . Таким образом, вы можете управлять несоответствием формы.

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