Невозможно выделить память для массива, преобразование rdkit в ошибку numpy array - PullRequest
0 голосов
/ 07 июля 2019

У меня есть список из 2215 молекул, закодированных как 2048 битных векторов. Я пытаюсь создать из него 2D-массив. Я использую rdkit library для преобразования в numy массивы. Код работал без проблем несколько недель назад, и теперь есть ошибка памяти, но я не могу понять, почему. Кто-нибудь может предложить решение?

Я попытался уменьшить список и сократить его до двух векторов. Я думал, что это поможет, но ошибка все еще появляется после некоторого времени обработки. Это наводит меня на мысль, что у меня на самом деле достаточно памяти.

# red_fp is the list of bit vectors

def rdkit_numpy_convert(red_fp):
    output = []
    for f in fp:
        arr = np.zeros((1,))
        DataStructs.ConvertToNumpyArray(f, arr)
        output.append(arr)
    return np.asarray(output)

# this one line causes the problem
x = rdkit_numpy_convert(red_fp)

это ошибка:

MemoryError  Traceback (most recent call last)
MemoryError: cannot allocate memory for array

The above exception was the direct cause of the following exception:

SystemError  Traceback (most recent call last)
<ipython-input-14-91594513666c> in <module>
----> 1 x = rdkit_numpy_convert(red_fp)

<ipython-input-13-78d1c9fdd07e> in rdkit_numpy_convert(red_fp)
      4     for f in fp:
      5         arr = np.zeros((1,))
----> 6         DataStructs.ConvertToNumpyArray(f, arr)
      7         output.append(arr)
      8     return np.asarray(output)

SystemError: <Boost.Python.function object at 0x55a2a5743520> returned a result with an error set

Ответы [ 2 ]

1 голос
/ 08 июля 2019

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

Я не уверен, какой тип отпечатка вы используете, но предполагается, что вы используетеMorgan fingerprints, я провел несколько быстрых экспериментов, и этот метод, кажется, зависает, когда я использую метод GetMorganFingerprint вместо метода GetMorganFingerprintAsBitVect.Я не уверен, почему возникает эта проблема, но я предположил, что это было связано с тем, что первый метод создает UIntSparseIntVect по сравнению с ExplicitBitVect, хотя я обнаружил, что при попытке использовать тот же метод с отпечатком пальца, созданным GetHashedMorganFingerprint, который также возвращаетa UIntSparseIntVect работает нормально.

Я предлагаю, если вы используете отпечатки пальцев Моргана, чтобы попробовать метод 'GetMorganFingerprintAsBitVect'

Редактировать:

Я провел еще пару экспериментов

mol = Chem.MolFromSmiles('c1ccccc1')

fp = AllChem.GetMorganFingerprint(mol, 2)
print(fp.GetLength())
'4294967295'

fp1 = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
print(fp1.GetNumBits())
'2048'

fp2 = AllChem.GetHashedMorganFingerprint(mol, 2)
print(fp2.GetLength())
'2048'

Как видите, отпечаток первого метода огромен, я изначально думал, что этот отпечаток находится в развернутом состоянии, поэтому используется разреженная структура данных, это объясняет, почему у вас возникают проблемы при попыткевыделить память для отпечатка пальца этого измерения.

0 голосов
/ 07 июля 2019

Я впервые слышу о rdkit, но похоже, что это оболочка Boost для кода C++.

Из документов https://www.rdkit.org/docs/source/rdkit.DataStructs.cDataStructs.html

вторым аргументом ConvertToNumpyArray является destArray.

rdkit.DataStructs.cDataStructs.ConvertToNumpyArray((ExplicitBitVect)bv, 
    (AtomPairsParameters)destArray) → None :¶

Я предполагаю, что эта функция пытается поместить преобразованные значения в destArray.Он не пытается выделять новую память сам (как это делал бы обычный конструктор numpy), а просто заполняет массив, который был ей предоставлен.

Если это предположение верно, то ошибка в

arr = np.zeros((1,))

То, что arr имеет место только для одного float, 8 байтов.arr должен быть достаточно большим (и правильным dtype), чтобы содержать результат, полученный с помощью Convert.

Есть ли какая-либо документация или примеры, иллюстрирующие использование этого преобразования?При задании вопросов о тегах с низким трафиком, таких как [rdkit], полезно добавить ссылки на документацию и пример кода.


Я посмотрел на другие [rdkit] SO.

Как я могу вычислить отпечаток графа Моргана как numpy.array?

предполагает, что я не прав.Принятый ответ использует

np.zeros((0,), dtype=np.int8)

, который выделяет 0 байтов для своего буфера данных.

И другой, который использует np.zeros((1,))

ValueError при выполнении проверки со случайными лесами

...