我正在做一些关于重复数据删除字符串的事情。 我的主要工作流程是:
df = pd.read_csv(some_path)
vect = TfidfVectorizer(min_df=1)
tfidf = vect.fit_transform(df.title.astype(unicode))
sml_matrix = (tfidf * tfidf.T)
sml_matrix = sml_matrix> similar_ratio
sml_matrix就像:
│CHEESE CHORES GEESE GLOVES
───────┼───────────────────────────
CHEESE │ 1 0.222 0.177 0.444
CHORES │0.222 1 0.422 0.333
GEESE │0.177 0.422 1 0.300
GLOVES │0.444 0.333 0.300 1
显然,计算sml_matrix的上三角就足够了。
但是我不知道如何只用scipy.sparse矩阵计算上三角形。(只有我可以想象的forloop,但似乎效率不高)
for循环示例(只是伪代码):
A = tfidf
T = tfidf.T
side_length = len(A)
for i in range(side_length):
for j in range(side_length):
if j < i:
# avoid calculate lower triangle and diagonal
continue
maxtrix[i,j] = A(i)* T(j)
来自here,我看到numpy只有np.apply_along_axis(d, 0, _)
来计算上三角形,但scipy.sparse
没有。
更新
无论一个大的数据集是多少,只计算上三角形会花费更少的cpu资源。我不熟悉矩阵计算,好奇心让我问这个问题(如何只计算稀疏矩阵中的上三角形),而不是用于解决内存错误。
答案 0 :(得分:1)
可能你可以通过一些技巧赢得2内存因素,但数据大小总是增长......
因此,最好忍受这种情况并将Dataframe拆分成块。 你可以这样做:
df=pd.DataFrame(np.random.rand(12)) # as a mini exemple
maxsize=4
df['group']=df.index//maxsize
df.set_index('group',append=True,inplace=True)
df2=df.reorder_levels([1,0])
from itertools import combinations
print(df)
for i,j in (combinations(df2.index.levels[0],2)):
print (df2.loc[[i,j]])
#or do something else.
然后df是:
0
group
0 0 0.388695
1 0 0.982780
2 0 0.632253
3 0 0.445638
4 1 0.346920
5 1 0.789327
6 1 0.311657
7 1 0.548581
8 2 0.688201
9 2 0.824547
10 2 0.980281
11 2 0.314968
大块是:
0
group
0 0 0.388695
1 0.982780
2 0.632253
3 0.445638
1 4 0.346920
5 0.789327
6 0.311657
7 0.548581
0
group
0 0 0.388695
1 0.982780
2 0.632253
3 0.445638
2 8 0.688201
9 0.824547
10 0.980281
11 0.314968
0
group
1 4 0.346920
5 0.789327
6 0.311657
7 0.548581
2 8 0.688201
9 0.824547
10 0.980281
11 0.314968
然后计算并收集每个块上的好东西。 你会做两次计算,但没有更多的内存错误。