Получение ошибки «Последние 2 измерения массива должны быть квадратными». Что это значит и как это решить?

#python #scipy #newtons-method

#python #scipy #метод ньютонов

Вопрос:

Вот мой код:

 def obj_function(x):
    val= 8*(x[0]**4)   3*(x[1]**2)- 6*x[0]*x[1]   2*x[1]
    return np.asmatrix(val)

def obj_function_prime(x):
    val=[32*(x[0]**3)-6*x[1], 6*x[1]-6*x[0] 2]
    return np.asmatrix(val)

def hess_obj_function(x):
    a= 96*(x[0]**2)
    b= -6
    c= -6
    d=  6
    val=[[a,b], [c,d]]
    return np.asmatrix(val)

tol= 10**(-6)
mu= 0.2
xk= np.asmatrix([1,1])
xold= np.asmatrix([0,0])

while np.linalg.norm(obj_function_prime(xk))> tol:
    xold=xk
    alpha=1.0
    while obj_function(xk- alpha*obj_function_prime(xk))> (obj_function(xk)- mu*alpha*np.dot(obj_function_prime(xk), obj_function(xk))):
        alpha=0.5* alpha
    xk= xk-alpha*obj_function_prime(xk)
    
print(" The minimum of the function occurs at", xk)
 

И это выдает мне ошибку:

 *
 

Трассировка LinAlgError (последний последний вызов
)
в
20 xold= np.matrix([0,0])
21
—> 22 в то время как np.linalg.norm(obj_function_prime(xk))> tol:
23 xold= xk
24 альфа = 1.0

 <ipython-input-3-c0704e734bdd> in obj_function_prime(x)
      4 
      5 def obj_function_prime(x):
----> 6     val=[32*(x[0]**3)-6*x[1], 6*x[1]-6*x[0] 2]
      7     return np.matrix(val)
      8 

~anaconda3libsite-packagesnumpymatrixlibdefmatrix.py in __pow__(self, other)
    231 
    232     def __pow__(self, other):
--> 233         return matrix_power(self, other)
    234 
    235     def __ipow__(self, other):

<__array_function__ internals> in matrix_power(*args, **kwargs)

~anaconda3libsite-packagesnumpylinalglinalg.py in matrix_power(a, n)
    620     a = asanyarray(a)
    621     _assert_stacked_2d(a)
--> 622     _assert_stacked_square(a)
    623 
    624     try:

~anaconda3libsite-packagesnumpylinalglinalg.py in _assert_stacked_square(*arrays)
    211         m, n = a.shape[-2:]
    212         if m != n:
--> 213             raise LinAlgError('Last 2 dimensions of the array must be square')
    214 
    215 def _assert_finite(*arrays):

LinAlgError: Last 2 dimensions of the array must be square
 

Что означает эта ошибка и как я могу ее устранить? Как мне преобразовать матрицу в квадратную, если она не определена таким образом?

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

1. Это означает, что последние два измерения должны быть одинаковыми. Полная трассировка может помочь точно определить, в чем проблема. Кроме того, я бы посоветовал избавиться от asmatrix вызовов. Попробуйте заставить это работать с обычными массивами numpy (они могут быть 2d, как np.matrix).

2. @hpaulj Я отредактировал вопрос и добавил трассировку стека. Пожалуйста, проверьте, спасибо!

3. Что x[0]**3 предполагается делать? Как вы думаете x[0] , что такое (форма, тип, dtype?). Соответствует ли это тому, что есть на самом деле?

Ответ №1:

Использование np.matrix вызывает проблемы.

Давайте создадим небольшую матрицу:

 In [273]: x = np.asmatrix([0,0])
In [274]: x
Out[274]: matrix([[0, 0]])
 

обратите внимание, что при индексации оно не меняется. Он выбирает первую «строку», но being np.matrix по-прежнему 2d.

 In [275]: x[0]
Out[275]: matrix([[0, 0]])
 

И ** np.matrix , по сути, матрица квадратная x@x .

 In [276]: x[0]**2
Traceback (most recent call last):
  File "<ipython-input-276-3908b7334115>", line 1, in <module>
    x[0]**2
  File "/usr/local/lib/python3.8/dist-packages/numpy/matrixlib/defmatrix.py", line 231, in __pow__
    return matrix_power(self, other)
  File "<__array_function__ internals>", line 5, in matrix_power
  File "/usr/local/lib/python3.8/dist-packages/numpy/linalg/linalg.py", line 621, in matrix_power
    _assert_stacked_square(a)
  File "/usr/local/lib/python3.8/dist-packages/numpy/linalg/linalg.py", line 204, in _assert_stacked_square
    raise LinAlgError('Last 2 dimensions of the array must be square')
LinAlgError: Last 2 dimensions of the array must be square
 

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