我们分析了一个大数据集,并将数据保存为Julia语言中的csc sparse array,然后我尝试使用scipy的csc_matrix在python语言中加载数组。然而,我的PC没有足够大的RAM来处理数据(我看到了警告:无法为具有形状的数组分配93.gib)。
因此,我希望在for循环下将这些数据作为小部分处理。
def get_jld(filename):
orient_list=[]
ID_num=999
f = h5py.File(filename, 'r')
data= f["sm"][()]
column_ptr=f[data[2]][:]-1 ## correct indexing from julia (starts at 1)
indices=f[data[3]][:]-1 ## correct indexing
values =f[data[4]][:]
for i in range(0, data[1], ID_num):
out = pd.DataFrame(csc_matrix((values,indices,column_ptr[i:i+ID_num+1]), shape=(data[0],ID_num)).toarray())
orient_angle=find_orientation(out)
orient_list.append(orient_angle)
f.close()
return orient_list
然而,csc_matrix发送了一个警告,说“索引指针应该从0开始”,这意味着每当我到达这个循环的第二次迭代时,csc_matrix将停止(不循环整个稀疏数组)。
ValueError Traceback (most recent call last)
Cell In[6], line 2
1 filename=vid_list[0]
----> 2 test = get_jld(filename)
Cell In[3], line 13, in get_jld(filename)
10 #indices[indices < time_start] = time_start
11 #print([data[0],data[1]])
12 for i in range(0, data[1], ID_num):
---> 13 out =pd.DataFrame(csc_matrix((values,indices,column_ptr[i:i+ID_num+1]), shape=(data[0],ID_num)).toarray())
14 orient_angle=find_orientation(out)
15 orient_list.append(orient_angle)
File ~\anaconda3\envs\qlm_analysis\lib\site-packages\scipy\sparse\_compressed.py:106, in _cs_matrix.__init__(self, arg1, shape, dtype, copy)
103 if dtype is not None:
104 self.data = self.data.astype(dtype, copy=False)
--> 106 self.check_format(full_check=False)
File ~\anaconda3\envs\qlm_analysis\lib\site-packages\scipy\sparse\_compressed.py:172, in _cs_matrix.check_format(self, full_check)
169 raise ValueError("index pointer size ({}) should be ({})"
170 "".format(len(self.indptr), major_dim + 1))
171 if (self.indptr[0] != 0):
--> 172 raise ValueError("index pointer should start with 0")
174 # check index and data arrays
175 if (len(self.indices) != len(self.data)):
ValueError: index pointer should start with 0
有人有什么建议来解决这个问题吗?
1条答案
按热度按时间kuarbcqp1#
让我们做一个csc矩阵(10 x10,密度为.2)
关键属性包括:
从中我可以看到第一列在第9行有一个nonero值-
data
中的第一个元素:类似地,最后一个
data
元素是第9列和第3行(indices
的最后一个值):indptr
从0开始,有11个元素。indptr
值告诉我们/python如何将data
和indices
值拆分为连续的列。因此,如果从'原始'值制作一个矩阵,他们可以匹配这个模式。
通常从
coo
风格的输入创建一个矩阵更容易,但是如果从其他csc
矩阵开始,或者如果你知道你在做什么,使用这个“原始”输入是可能的。它更快,但也更容易搞砸。我还没有看过你的图片,但我认为你是一个大的csc字符串,并试图从它的
data/indices/indptr
的子集使较小的csc。我自己还没有试过这样做,所以我不知道你必须采取什么调整才能做好。(我通常使用CSR格式,所以我不得不在精神上将描述切换到CSC。)