给出:
import numpy as np
import scipy
print(np.__version__, scipy.__version__) # numpy: 1.23.5 scipy: 1.11.3
字符串
为了避免内存错误,我想在不将切片数组转换为密集数组的情况下将其展平或压缩:
mtx=scipy.sparse.lil_matrix((int(2e8), int(4e9)), dtype=np.float32) # very large lil_matrix
mtx[:int(4e6), :int(7e4)]=np.random.rand(int(4e6), int(7e4))
flat_mtx=mtx.getrowview(0).flatten() # sliced example: row: 0
型
但我得到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'lil_matrix' object has no attribute 'flatten'
型
对于较小的大小,我可以选择mtx.getrowview(0).toarray().flatten()
或更快的np.squeeze(sp_mtx.getrowview(0).toarray())
方法,但对于较大的大小,我不想转换为密集的numpy
数组。
什么是简单和内存高效的方法来扁平化或挤压scipy
稀疏lil_matrix
?
2条答案
按热度按时间bq9c1y661#
像lil_matrix这样的稀疏矩阵只适用于2维Tensor,所以将其展平到一维是没有意义的。因此,它并不真正受支持。你在下游的用法是什么?
我建议将其重新整形为一行,并沿着该行查询其条目:
字符串
a11xaf1n2#
一个更温和的lil矩阵:
字符串
这仍然是一个lil矩阵。因为你发现它没有
flatten
方法。你在lil
文档中找到了getrowview
,但你没有找到flatten
,是吗?阅读实际文档,而不是你的愿望。型
同样从文档中,你可以看到
lil
有两个属性,data
和rows
,两个对象都包含列表:型
lil
是唯一的,因为它可以得到一个view
(在ndarray意义上)的行。其他稀疏格式没有。例如,没有columnview
。外部对象数组表示
row
层,内部列表是列。稀疏数组没有一维表示。但是为什么你想要一个
flatten
。稀疏矩阵,在np.matrix
的模式中只有2d,所以flatten并不意味着什么。为了强调这一点,
二维密集阵列:
型
1d:
型
二维密集
matrix
:型
仍然2D:
型
A
np.matrix
“捷径”:型
在
scipy
中有一个转换为类似数组的对象的动作,例如lil_array
,但这仍然是一个正在进行的工作。型
还是没有
flatten
。