Создание матрицы из строк, которые передаются через список, который создает строки на Python

#python #arrays #numpy #matrix

#python #массивы #numpy #матрица

Вопрос:

Вот проблема:

Используя функцию row_func() , создайте функцию design_matrix() , которая принимает в качестве входных данных целое число n и возвращает NumPy массив, j строка которого является

 [1, np.cos(t_j), np.sin(t_j), ... , np.cos(n*t_j), np.sin(n*t_j)]
  

где t_j это j -е значение времени в T . Другими словами, design_matrix(n) следует создать матрицу, j -я строка которой является row_func(t_j, n) .

Вот row_func() ; Я сделал это первым и протестировал, чтобы убедиться, что это сработало.

 def row_func(t,n):
    L = [f for k in range(1,n 1) for f in [np.cos(t*k), np.sin(t*k)]]
    L.insert(0,1)
    return L
  

Этот код выдает мне строку чисел, основанную на функции

 [1, cos(t), sin(t), cos(2*t), sin(2*t) , ... , cos(n*t), sin(n*t)]
  

T также есть строка из 291 числа, в которую я импортировал.

design_matrix(10).shape должно возвращать значение (629, 21) и design_matrix(4)[100,:] должно возвращать строку

 array([ 1. , 0.54030231, 0.84147098, -0.41614684, 0.90929743,
  -0.9899925 , 0.14112001, -0.65364362, -0.7568025 ])
  

Вот что я пробовал: поскольку я пытаюсь получить j -е значение времени в массиве T , это должно быть так же просто, как замена t на T в моей функции, верно?

 def design_matrix(n):
    X_matrix = np.array(row_func(T,n))
    return X_matrix
  

row_func() следует захватить значения t и вычислить их в строке. Однако я получаю:

 ValueError: setting an array element with a sequence as an error.
  

Итак, мой вопрос в том, как мне построить матрицу из строки / столбца и функции, которая строит строки для меня?

Комментарии:

1. Что вы подразумеваете под «построением матрицы из строки»? Если вы уже записали нужную строку, то это зависит от ее формата. Если строка представляет собой серию pandas (скажем, s), то вы можете просто использовать s.values . Что вы подразумеваете под «строит строки для меня»? Построить ее из отдельных ячеек?

2. Итак, row_func создает строку [1,cos (t), sin (t), cos (2 * t), sin (2 * t), … , cos (nt), sin(nt)], и мне нужно построить матрицу из [1,np.cos(t_j),np.sin(t_j), … ,np.cos(nt_j), np.sin(nt_j)], где T — строка сама по себе. Таким образом, по сути, это должно построить матрицу высотой 291 строка и шириной 2n 1 столбца (потому что функция row запускает sin, cos, а затем я вставил 1 в начале)

3. @bartcubrich Извините, я не знаю, имел ли смысл мой предыдущий комментарий. По сути, мне нужна row_func для запуска своей функции в строке (или для каждого значения в T-векторе / массиве).

Ответ №1:

Вы могли бы попробовать использовать numpy.stack() .

 def design_matrix(n):
    row_list = []
    for t in T:
        row_list.append(
            np.array(row_func(t, n)))

    return np.stack(row_list, axis=0)
  

Комментарии:

1. T — это массив из 691 значения. Когда я пытаюсь design_matrix (4)[100,:], я получаю, что индекс 100 выходит за пределы оси 0 с размером 4. Кажется, что он не создает правильный размер строки? Это проблема с начальным циклом for? Должно ли это быть T.size?

2. @Joe-You-Know Ах, количество строк должно быть фиксированным, хорошо. Я отредактировал свой ответ

3. похоже, это работает! Спасибо за вашу помощь! Я приму это, когда смогу. Похоже, что укладка сработала.