Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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 为什么scipy.sparse.csr_矩阵没有存储传递给它的所有值?_Python_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

Python 为什么scipy.sparse.csr_矩阵没有存储传递给它的所有值?

Python 为什么scipy.sparse.csr_矩阵没有存储传递给它的所有值?,python,numpy,scipy,sparse-matrix,Python,Numpy,Scipy,Sparse Matrix,因此,我目前正在尝试以csr_格式存储一个大型稀疏数据集(490万行和6000列)。密集格式导致内存错误,所以我从tsv文件逐行加载它。 我是这样做的: import numpy as np from scipy.sparse import csr_matrix rows=np.empty(4865518,dtype=np.int16) cols=np.empty(165050535,dtype=np.int16) values=np.empty(165050535,dtype=np.int16

因此,我目前正在尝试以csr_格式存储一个大型稀疏数据集(490万行和6000列)。密集格式导致内存错误,所以我从tsv文件逐行加载它。 我是这样做的:

import numpy as np
from scipy.sparse import csr_matrix
rows=np.empty(4865518,dtype=np.int16)
cols=np.empty(165050535,dtype=np.int16)
values=np.empty(165050535,dtype=np.int16)
labels=np.empty(4865517,dtype=np.int8)
file=open(r'HI-union-allFeatures\HI-union-allFeatures-nonZero-train0.tsv','r')
count=0
nnz=0
col_count=0
for l in file:
    if count>0:
        l=l.strip().split("\t")
        line=l[2:-1]
        labels[count-1]=l[-1]
        for pair in line:
            pair=pair.split()
            cols[col_count]=pair[0]
            cols[col_count]-=3
            values[col_count]=pair[1]
            col_count+=1
        nnz+=len(line)
        rows[count]=nnz        
    count+=1
cols.astype(np.int16,copy=False) #cols gets stored as 32 bit for some reason.
cols.shape #(165050535,)
rows.shape #(4865518,)
values.shape #(165050535,)
data=csr_matrix((values, cols, rows),copy=False)
data.nnz #30887
data.data.shape #should match values.shape but output is (30887,)
data.indices.shape #should match cols.shape but output is (30887,)
data.indptr.shape #matches rows.shape (4865518,)
但是,在创建csr_矩阵之后,它只会删除一些值。我不明白为什么。下面是显示data.data.shape与values.shape不匹配的屏幕截图。我还验证了原始行、列和值数组中的数据,它们完美地表示了数据,所以我不理解这种行为。我的电脑内存没有用完,我有16gb的ram,这个程序只占1GB。编辑:这是我在这里的第一个问题,如果我没有正确发布,我很抱歉。任何帮助都会很好。
np.empty不会将数组初始化为零。行[0]的值可以是任何值

与零不同,empty不会将数组值设置为零,因此可能会稍微快一些。另一方面,它要求用户手动设置数组中的所有值,使用时应谨慎

Int16的最大值为32767。行指针的最大值为1.65亿。这就是为什么您的数据现在小于int16


这两件事都是巨大的问题。如果没有示例数据,就不可能提供一个可用的修复程序作为答案。

您能否提供有关tsv文件结构的更多信息?数据是如何表示的?数据文件中的值是什么类型的?大小如1650555,数据取自文件,我们无法再现或诊断您的问题。您可以检查的一件事是
值是否有0,以及这些值是否已在
data.data
中消除。我们更喜欢在复制粘贴而不是屏幕截图中查看程序结果。在这种情况下,屏幕快照不会太大。在这个选项卡和显示快照的选项卡之间来回切换仍然是一件痛苦的事情。行(0)从未被填充,可以是任何内容。我很惊讶这一切都起作用了。很抱歉刚才看到这么多评论。tsv文件存储为一对(列号、值)。所有值都是整数,可以限制在16位。这是文件中的一个示例行:2858 3 3806 1 4527 1数字165050535是文件中需要存储在值数组中的非零条目数。不存在零。我对其进行了编辑,以显示复制和粘贴格式。我尝试填充行[0]并获得相同的输出。另外,当我询问行[0]的值时,它会给我一个零。正确的
索引
indptr
数组是
np.int32
(对于大型矩阵甚至
int64
)@CJR谢谢。删除dtype值可以使数组更大。