Ошибка со структурой массива, переданной в качестве аргумента для совместной диагонализации

#python #python-3.x #numpy #matrix #numpy-ndarray

#python #python-3.x #numpy #матрица #numpy-ndarray

Вопрос:

Я пытаюсь использовать ffdiag (pybss) из следующей функции :

 def ffdiag(X, max_lag = 10, eps = 1.0e-10, max_iter = 100):
    '''
    Blind source separation using FFDIAG.  This version does not require that
    the estimated mixing matrix be orthogonal.

    INPUT:
    ------
    X : array, required
        N_sig x t matrix of signal mixtures

    max_lag : int, optional
        maximum lag (in samples) for covariance matrix calculation

    eps : double, optional
        convergence criterion for matrix updates

    max_iter : int, optional
        maximum number of iterations/updates
    '''
    R_tau = linalg.lagged_covariance(X,max_lag)
    dim = len(R_tau[0])
    n_lags = len(R_tau.keys())
    W = zeros((dim,dim))
    V = eye(dim)
    C = R_tau
    niter = 0
    theta = 0.9
    iter_eps = 1.0
 

с lagged_covariance определением :

 def lagged_covariance(X, max_lag):
    '''
    Generates a dictionary of lagged covariance matrices of matrix X, for
    lags 0,1,2,...,max_lag.

    INPUT:
    ------
    X : array, required
        N x t data matrix

    max_lag : integer, required
        covariance matrices will be computed for lags 0,1,...,max_lag

    OUTPUT:
    ------
    R_tau : dictionary, keyed on the lag, with values equal to the lagged
        covariance of X with the lagged version of itself.
    '''
    R_tau = {}
    t = X.shape[1]
    dim = X.shape[0]
    R_tau[0] = cov(X,X)[0:dim,dim::]
    for tau in range(1,max_lag 1):
        for i in range(tau,t):
            # create X(t) and X(t-tau)
            X_t = X[:,0:t-tau]
 

Я получаю следующую ошибку :

 /Users/henry/pybss/linalg.py", line 92, in lagged_covariance
    R_tau[0] = cov(X,X)[0:dim,dim::]
  File "<__array_function__ internals>", line 6, in cov
  File "/opt/intel/intelpython3/lib/python3.7/site-packages/numpy/lib/function_base.py", line 2371, in cov
    raise ValueError("m has more than 2 dimensions")
ValueError: m has more than 2 dimensions
 

В моем скрипте я вызываю ffdiag так :

 # dimension
m=7
# number of matrices
n=2

# Load spectro and WL GCph XC
FISH_GCsp = np.loadtxt('Fisher_GCsp_flat.txt')
FISH_XC = np.loadtxt('Fisher_XC_GCph_WL_flat.txt')

# Marginalizing over uncommon parameters between the two matrices
COV_GCsp_first = np.linalg.inv(FISH_GCsp)
COV_XC_first = np.linalg.inv(FISH_XC)
COV_GCsp = COV_GCsp_first[0:m,0:m]
COV_XC = COV_XC_first[0:m,0:m]
# Invert to get Fisher matrix
FISH_sp = np.linalg.inv(COV_GCsp)
FISH_xc = np.linalg.inv(COV_XC)
# Drawing a random set of commuting matrices
C=np.zeros((n,m,m));
B=np.zeros((n,m,m));
C[0,:,:] = np.array(FISH_sp)
C[1,:,:] = np.array(FISH_xc)

[invV, B, ut] = ffdiag(C, 10, 1.0e-10, 100)
 

но я не знаю C , правильно ли определен массив: в любом случае мне нужно передать 2 матрицы размером 7×7, но в каком порядке :

 # dimension
m=7
# number of matrices
n=2

C=np.zeros((n,m,m));
B=np.zeros((n,m,m));
 

или

 C=np.zeros((m,m,n));
B=np.zeros((m,m,n));
 

или что-то еще, поскольку оба вышеперечисленных, похоже, не работают.

Как вы можете видеть в определении ffdiag, это замечено :

 INPUT:
        ------
        X : array, required
            N_sig x t matrix of signal mixtures
 

Но я не могу догадаться, какая структура X array .

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

1. Обратите внимание, что мы предпочитаем технический стиль написания здесь. Мы мягко не поощряем приветствия, надеюсь, вы сможете помочь, спасибо, заранее благодарим, благодарственные записки, пожелания, добрые пожелания, подписи, пожалуйста, помогите, болтливый материал и сокращенный txtspk, мольбы, как долго вы застряли, советы для голосования, мета-комментарии и т. Д. Просто объясните свою проблему и покажите, что вы пробовали, чего ожидали и что на самом деле произошло.

2. В частности, в ваших вопросах есть «любая помощь приветствуется» в различных перестановках, несмотря на то, что теперь они были отредактированы из более чем 40 из них. Добровольцев, желающих поощрять техническое написание, и так слишком мало, и тысячи людей в день приходят, желая использовать Stack Overflow в качестве чата. Помилуй нас!