установка элемента массива с ошибкой последовательности в python - PullRequest
0 голосов
/ 25 марта 2020

Я начал изучать python, и у меня есть вопрос к программе. Я пишу в качестве первого шага, который я подумал о создании большой матрицы и больших векторов, где я буду помещать несколько меньших векторов и меньшие матрицы. Я создал наугад.

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

"установка элемента массива с последовательностью."

import numpy as np
from scipy import linalg as lg
import math

N=5;
n=3;
Qs=np.zeros((n,N*n))
xs=np.zeros(n*N)
qs=np.zeros(n*N)
grads=np.zeros(N*n)
Lfi=np.zeros(N)
pis=np.zeros(N*n)
pi=np.zeros(N)
phat=np.zeros(N)
j=0;
gamma=np.zeros(N)
def gradient(Q,x) :
  return x.transpose().dot(Q)

def eigen(Q):
  val, vec = lg.eig(Q)
  return np.amax(Q)

for i in range(0,N):
  A = np.random.randint(10, size=(n,n))
  Qs[0:n,j:j+n] += A
  x = np.random.randint(10, size=(n))
  qs[j:j+n] += x
  x = np.random.randint(10, size=(n))
  xs[j:j+n] += x
  j = j+n
  Lfi[i] = eigen(A)
  grads[i] = gradient(A,x)

Почему Я получаю ошибку для градиента, а не, например, на Lfi?

1 Ответ

0 голосов
/ 25 марта 2020

Ваша gradient функция возвращает нечто иное, чем ожидается от grads. Из сообщения об ошибке я могу сказать, что grads - это массив numpy, который не так прост, как список по умолчанию python. У него есть связанный с ним тип, и он требует, чтобы каждый элемент был этого типа.

например,

a = np.array([0] * 10)
print(type(a[0]))

это скажет вам, что тип элементов в этом массиве numpy.int64 (очевидно, есть много типов, и это только один из них). Если вы попытаетесь присвоить какое-либо значение другого типа, python попытается привести его к numpy.int64. Но очевидно, что не существует разумного (общего) способа привести другой массив или матрицу к одному числу.

Если вы попробуете

a[0] = [1, 2, 3]

, тогда вы получите ошибку, упомянутую вами

ValueError: установка элемента массива с последовательностью.


А почему вы не получаете сообщение об ошибке при вызове функции eigen? Ну, потому что он просто возвращает одно значение, а не массив. np.amax(Q) возвращает одно значение, если не указан параметр axis, для которого по умолчанию установлено значение None.

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