Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 稀疏数组的numpy向量列表_Python_Arrays_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 稀疏数组的numpy向量列表

Python 稀疏数组的numpy向量列表,python,arrays,numpy,scipy,sparse-matrix,Python,Arrays,Numpy,Scipy,Sparse Matrix,我有一个格式的numpy向量列表: [array([[-0.36314615, 0.80562619, -0.82777381, ..., 2.00876354,2.08571887, -1.24526026]]), array([[ 0.9766923 , -0.05725135, -0.38505339, ..., 0.12187988,-0.83129255, 0.32003683]]), array([[-0.59539878, 2.2716687

我有一个格式的numpy向量列表:

    [array([[-0.36314615,  0.80562619, -0.82777381, ...,  2.00876354,2.08571887, -1.24526026]]), 
     array([[ 0.9766923 , -0.05725135, -0.38505339, ...,  0.12187988,-0.83129255,  0.32003683]]),
     array([[-0.59539878,  2.27166874,  0.39192573, ..., -0.73741573,1.49082653,  1.42466276]])]
这里,仅显示列表中的3个向量。我有100个

一个向量中的最大元素数约为1000万

列表中的所有数组的元素数都不相等,但最大元素数是固定的。 是否可以在python中使用这些向量创建稀疏矩阵,这样我就可以用零来代替小于最大大小的向量的元素?

尝试以下方法:

from scipy import sparse
M = sparse.lil_matrix((num_of_vectors, max_vector_size))

for i,v in enumerate(vectors):
     M[i, :v.size] = v
然后看看这一页:


lil_矩阵
格式适合构建矩阵,但在对其进行操作之前,您需要将其转换为另一种格式,如
csr_矩阵

在这种方法中,您将thresold下面的元素替换为
0
,然后用它们创建一个稀疏矩阵。我建议使用
coo_矩阵
,因为它是根据您的目的转换为其他类型的最快方法。然后您可以
scipy.sparse.vstack()
使用它们构建矩阵,计算列表中的所有元素:

import scipy.sparse as ss
import numpy as np

old_list = [np.random.random(100000) for i in range(5)]

threshold = 0.01
for a in old_list:
    a[np.absolute(a) < threshold] = 0
old_list = [ss.coo_matrix(a) for a in old_list]
m = ss.vstack( old_list )
将scipy.sparse导入为ss
将numpy作为np导入
旧列表=[np.random.random(100000)表示范围(5)内的i]
阈值=0.01
对于旧目录中的列表:
a[np.绝对值(a)<阈值]=0
old_list=[ss.coo_矩阵(a)用于旧_列表中的a]
m=ss.vstack(旧列表)

有点复杂,但我可能会这样做:

>>> import scipy.sparse as sps
>>> a = [np.arange(5), np.arange(7), np.arange(3)]
>>> lens = [len(j) for j in a]
>>> cols = np.concatenate([np.arange(j) for j in lens])
>>> rows = np.concatenate([np.repeat(j, len_) for j, len_ in enumerate(lens)])
>>> data = np.concatenate(a)
>>> b = sps.coo_matrix((data,(rows, cols)))
>>> b.toarray()
array([[0, 1, 2, 3, 4, 0, 0],
       [0, 1, 2, 3, 4, 5, 6],
       [0, 1, 2, 0, 0, 0, 0]])

lil_矩阵是否应该像这样转换为csr_矩阵:M.tocsr()?还有什么更快的方法吗?@AbhishekThakur:那么,你最初是如何得到向量列表的?如果你可以直接填充稀疏矩阵…还有,你有没有特定的性能标准?实际上,我的最终矩阵的大小是:10k x 10mil。因此,我认为这不是一种可行的方法……如果您跳过
.toarray
,我刚才添加它是为了表明
b
中存储的内容是您想要的,那么您不会产生太多开销。它可以被重写以直接生成CSR矩阵的索引,但这就不那么清楚了。@AbhishekThakur我刚刚在这里进行了双重测试,它可以工作。。。我已经更新了答案,添加了一行显示如何创建旧列表。。。尝试运行并打印
m
稀疏矩阵,以查看其外观。。。