ValueError: матрица должна быть двумерной при передаче двух массивов в функцию - PullRequest
1 голос
/ 06 июня 2019

У меня есть функция, которая написана полностью в виде простых функций и принимает два входных значения. Функция состоит из нескольких матричных операций, и когда я передаю два больших массива, она дает мне ValueError: матрица должна быть двумерной. Использование циклов и numpy.apply_along_axis решит проблему, но эти методы делают код очень медленным.

Ниже приведен код, который я написал


import numpy as np
import random
data = np.random.normal(size=600*600*2)
data = data.reshape(600*600,2)

def fun(x,y):
    f1 = sin(x)*cos(y)
    f2 = cos(x)*sin(y)
    eig1 = f1*np.mat([[f1],[f2]])
    eig2 = f2*np.mat([[f2+f1],[f1]])
    return np.sum(np.linalg.eig(eig1*eig2.T)[0])


fun(data[:,0],data[:,1])

Это дает мне следующую ошибку

ValueError: матрица должна быть двумерной

1 Ответ

0 голосов
/ 06 июня 2019

И обратная связь:

     ...: fun(data[:,0],data[:,1])                                                                     
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-262-144f145bebe5> in <module>
     10 
     11 
---> 12 fun(data[:,0],data[:,1])

<ipython-input-262-144f145bebe5> in fun(x, y)
      5     f1 = np.sin(x)*np.cos(y)
      6     f2 = np.cos(x)*np.sin(y)
----> 7     eig1 = f1*np.mat([[f1],[f2]])
      8     eig2 = f2*np.mat([[f2+f1],[f1]])
      9     return np.sum(np.linalg.eig(eig1*eig2.T)[0])

/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in asmatrix(data, dtype)
     69 
     70     """
---> 71     return matrix(data, dtype=dtype, copy=False)
     72 
     73 

/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in __new__(subtype, data, dtype, copy)
    149         shape = arr.shape
    150         if (ndim > 2):
--> 151             raise ValueError("matrix must be 2-dimensional")
    152         elif ndim == 0:
    153             shape = (1, 1)

ValueError: matrix must be 2-dimensional

Таким образом, проблема заключается в вводе функции np.mat. Что это?

In [263]: data.shape                                                                                   
Out[263]: (360000, 2)

Вызовы sin / cos не меняют форму, поэтому:

In [264]: [[data[:,0]],[data[:,1]]]                                                                                             
Out[264]: 
[[array([-0.95915424,  1.38013956,  1.26480082, ...,  1.34129623,
          1.14664781,  0.90385798])],
 [array([-0.77785621,  0.695089  ,  1.17894725, ..., -0.2891861 ,
          0.47051436, -0.22550854])]]
In [265]: np.array([[data[:,0]],[data[:,1]]])                                                          
Out[265]: 
array([[[-0.95915424,  1.38013956,  1.26480082, ...,  1.34129623,
          1.14664781,  0.90385798]],

       [[-0.77785621,  0.695089  ,  1.17894725, ..., -0.2891861 ,
          0.47051436, -0.22550854]]])
In [266]: _.shape                                                                                      
Out[266]: (2, 1, 360000)

Итак, вы пытаетесь дать np.mat трехмерный массив.

np.mat работает, если я опущу []:

In [274]: np.mat([data[:,0],data[:,1]]).shape                                                          
Out[274]: (2, 360000)

но f1*np.mat([f1,f2]) имеет проблему с матричным произведением:

In [275]: data[:,0]*np.mat([data[:,0],data[:,1]])                                                      
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-275-555ec143af3f> in <module>
----> 1 data[:,0]*np.mat([data[:,0],data[:,1]])

/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in __rmul__(self, other)
    224 
    225     def __rmul__(self, other):
--> 226         return N.dot(other, self)
    227 
    228     def __imul__(self, other):

ValueError: shapes (360000,) and (2,360000) not aligned: 360000 (dim 0) != 2 (dim 0)

Производя np.mat, * теперь является dot продуктом, а не поэлементным продуктом.

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