Как сжать матрицу, чтобы избежать ошибки памяти? - PullRequest
0 голосов
/ 15 ноября 2018

Ниже приведен массив, который у меня есть. Мне нужно создать матрицу, содержащую Zeors для экземпляра, как np.zeroes([1,1]).

newEdges = 

array([['0', 'Firm'],
       ['1', 'Firm'],
       ['2', 'Firm'],
       ..., 
       ['binA', 'year2017_bin'],
       ['binA', 'year2017_bin'],
       ['binA', 'year2017_bin']],
      dtype='<U21')



newEdges.shape 

#(63673218, 2)

newEdges.size
#127346436

Однако, исходя из размера моей матрицы (как вы можете видеть выше, то есть (63673218, 2)), если я запускаю синтаксис для генерации матрицы нулей, я получаю Memory Error.

У него полный синтаксис:

print(newEdges)
unique_Bin = np.unique(newEdges[:,0])
n_unique_Bin = len(unique_Bin)
unique_Bin
n_unique_Bin
#3351248

Q = np.zeros([n_unique_Bin,n_unique_Bin])

--------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
<ipython-input-16-581dfaca2eab> in <module>()
----> 1 Q = np.zeros([n_unique_Bin,n_unique_Bin])

MemoryError: 

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

for n, employer_employee in enumerate(newEdges):
    #print(employer_employee)
    #copy the array for the original o be intact
    eee = np.copy(newEdges)

    #sustitue the current tuple with a empty one to avoid self comparing
    eee[n] = (None,None)
    #get the index for the current employee, the one on the y axis
    employee_index = np.where(employer_employee[0] != unique_Bin)

    #get the indexes where the the employees letter match
    eq_index = np.where(eee[:,1] == employer_employee[1])[0]
    eq_employee = eee[eq_index,0]
    #add at the final array Q by index
    for emp in eq_employee:
        #print(np.unique(emp))
        emp_index = np.where(unique_Bin == emp)
        #print(emp)

        Q[employee_index,emp_index]+= 1
#         print(Q)

print(Q)

У меня в памяти осталось 24 ГБ для этого расчета.

1 Ответ

0 голосов
/ 15 ноября 2018

Просто чтобы указать на это, вы пытаетесь создать массив размером 3 351 248 x 3 351 248.Это 11,230,863,157,504 записей!11,2 трлн записей!Тот факт, что вы пытались напечатать это, заставляет меня думать, что вы не поняли, насколько он велик.Я не думаю, что вы сможете сделать это без разреженных матриц.Прежде всего, вы, вероятно, должны убедиться, что вам нужно сделать это, и посмотреть, есть ли другой способ.

В противном случае вы можете создать разреженную матрицу, используя scipy

import numpy as np
import scipy
Q = scipy.sparse.csr_matrix((n_unique_Bin,n_unique_Bin), dtype = np.int8)

Затем перейдите оттуда.

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