无法为数组分配内存,rdkit 转换为 numpy 数组错误
Cannot allocate memory for array, rdkit converting to numpy array error
我有一个编码为 2048 位向量的 2215 个分子的列表。我想要做的是从中创建二维数组。我正在使用 rdkit
library 转换为 numpy 数组。几周前代码没有问题,现在出现内存错误,但我不明白为什么。谁能提供解决方案?
我试图缩小列表并将其缩减为两个向量。我认为这会有所帮助,但经过一段时间的处理后,错误仍然会弹出。这让我相信我确实有足够的内存。
# 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
这是我第一次听说 rdkit
,但看起来这是 C++
代码的 Boost
包装器。
根据文档,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
只有space一个浮点数,8个字节。 arr
需要足够大(和正确的 dtype
)来容纳 Convert
.
产生的结果
是否有说明此转换用法的文档或示例?当询问有关 [rdkit]
等低流量标签的问题时,如果您包含一些指向文档和示例代码的链接,它会有所帮助。
我看了一眼其他[rdkit]
SO.
表明我错了。接受的答案使用
np.zeros((0,), dtype=np.int8)
它为其数据缓冲区分配了 0 个字节。
另一个使用 np.zeros((1,))
ValueError when doing validation with random forests
我认为您的问题是您使用的指纹与这种转换为 numpy 数组的方法不兼容。
我不确定您使用的是什么类型的指纹,但假设您使用的是摩根指纹,我做了一些快速实验,当我使用 'GetMorganFingerprint' 方法与 'GetMorganFingerprintAsBitVect' 方法。我不确定为什么会出现这个问题,但我认为这是由于第一个方法产生的是 UIntSparseIntVect 而不是 ExplicitBitVect,尽管我发现当我尝试使用 'GetHashedMorganFingerprint' 产生的指纹时使用相同的方法,这还有 returns 一个 UIntSparseIntVect 它工作正常。
建议如果你用的是morgan指纹试试'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'
如您所见,第一种方法的指纹很大,我最初的想法是这个指纹处于展开状态,因此使用了稀疏 data-structure,这可以解释为什么您尝试时遇到问题为这个维度的指纹分配内存。
我有一个编码为 2048 位向量的 2215 个分子的列表。我想要做的是从中创建二维数组。我正在使用 rdkit
library 转换为 numpy 数组。几周前代码没有问题,现在出现内存错误,但我不明白为什么。谁能提供解决方案?
我试图缩小列表并将其缩减为两个向量。我认为这会有所帮助,但经过一段时间的处理后,错误仍然会弹出。这让我相信我确实有足够的内存。
# 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
这是我第一次听说 rdkit
,但看起来这是 C++
代码的 Boost
包装器。
根据文档,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
只有space一个浮点数,8个字节。 arr
需要足够大(和正确的 dtype
)来容纳 Convert
.
是否有说明此转换用法的文档或示例?当询问有关 [rdkit]
等低流量标签的问题时,如果您包含一些指向文档和示例代码的链接,它会有所帮助。
我看了一眼其他[rdkit]
SO.
表明我错了。接受的答案使用
np.zeros((0,), dtype=np.int8)
它为其数据缓冲区分配了 0 个字节。
另一个使用 np.zeros((1,))
ValueError when doing validation with random forests
我认为您的问题是您使用的指纹与这种转换为 numpy 数组的方法不兼容。
我不确定您使用的是什么类型的指纹,但假设您使用的是摩根指纹,我做了一些快速实验,当我使用 'GetMorganFingerprint' 方法与 'GetMorganFingerprintAsBitVect' 方法。我不确定为什么会出现这个问题,但我认为这是由于第一个方法产生的是 UIntSparseIntVect 而不是 ExplicitBitVect,尽管我发现当我尝试使用 'GetHashedMorganFingerprint' 产生的指纹时使用相同的方法,这还有 returns 一个 UIntSparseIntVect 它工作正常。
建议如果你用的是morgan指纹试试'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'
如您所见,第一种方法的指纹很大,我最初的想法是这个指纹处于展开状态,因此使用了稀疏 data-structure,这可以解释为什么您尝试时遇到问题为这个维度的指纹分配内存。