当前位置: 首页 > 面试题库 >

Scipy.sparse.csr_matrix:如何获取十大值和索引?

周枫涟
2023-03-14
问题内容

我人数众多,csr_matrix并且我对前十个值及其每行的索引感兴趣。但是我没有找到一种体面的方式来操纵矩阵。

这是我当前的解决方案,主要思想是逐行处理它们:

row = csr_matrix.getrow(row_number).toarray()[0].ravel()
top_ten_indicies = row.argsort()[-10:]
top_ten_values = row[row.argsort()[-10:]]

这样做csr_matrix不会充分利用的优势。它更像是一种蛮力解决方案。


问题答案:

csr在这种情况下,我看不到格式的优点是什么。当然,所有非零值都收集在一个.data数组中,相应的列索引在中.indices。但是它们处于不同长度的块中。这意味着它们不能并行或以numpy数组步幅进行处理。

一种解决方案是将这些块填充为公共长度块。就是.toarray()那样 然后,您可以使用argsort(axis=1) or withargpartition`找到最大值。

另一个方法是将它们分成行大小的块,并处理每个块。这就是您使用所做的.getrow。分解它们的另一种方法是转换为lil格式,并处理.dataand.rows数组的子列表。

第三种可能的选择是使用该ufunc reduceat方法。这使您可以将ufunc
reduction方法应用于数组的顺序块。建立ufunc这样的np.add优势。
argsort不是这样的功能。但是有一种ufunc从Python函数构造a的方法,并且可以在常规Python迭代中获得一定的速度。[我需要查看一个最近的SO问题来说明这一点。]

我将通过一个更简单的函数来说明其中的一些问题,即按行求和。

IfA2是一个CSR矩阵。

A2.sum(axis=1)  # the fastest compile csr method
A2.A.sum(axis=1)  # same, but with a dense intermediary
[np.sum(l.data) for l in A2]  # iterate over the rows of A2
[np.sum(A2.getrow(i).data) for i in range(A2.shape[0])]  # iterate with index
[np.sum(l) for l in A2.tolil().data]  # sum the sublists of lil format
np.add.reduceat(A2.data, A2.indptr[:-1])  # with reduceat

A2.sum(axis=1)被实现为矩阵乘法。这与排序问题无关,但仍然是一种求和问题的有趣方式。请记住,csr格式是为有效乘法而开发的。

对于我当前的样本矩阵(为另一个SO稀疏问题创建)

<8x47752 sparse matrix of type '<class 'numpy.float32'>'
     with 32 stored elements in Compressed Sparse Row format>

行总和的实现np.frompyfunc

In [741]: def foo(a,b):
    return a+b  
In [742]: vfoo=np.frompyfunc(foo,2,1)
In [743]: timeit vfoo.reduceat(A2.data,A2.indptr[:-1],dtype=object).astype(float)
10000 loops, best of 3: 26.2 µs per loop

那是可观的速度。但是我想不出一种编写argsort通过还原实现的二进制函数(带2个参数)的方法。因此,这可能是该问题的死胡同。



 类似资料:
  • 我有两个数组 它们的长度都是4。City保存每个城市的名称,temp保存每个城市的平均温度。温度中的温度与城市中的城市顺序相同。所以我的问题是,我怎样才能得到temp中最大int的索引?我想打印出来

  • 问题内容: 我正在尝试使用HashMap将唯一字符串映射到字符串ArrayList,如下所示: 基本上,我希望能够通过数字访问密钥,而不是使用密钥名称。我希望能够访问所述键的值,以对其进行迭代。我在想像这样的事情: 是否有捷径可寻? 问题答案: 您可以通过调用来遍历键,也可以通过调用来遍历项。遍历条目可能会更快。 如果要确保按插入键的顺序遍历键,请使用。 顺便说一句,我建议将地图的声明类型更改为。

  • 问题内容: NumPy提出了一种通过来获取数组最大值的索引的方法。 我想要类似的事情,但是返回N最大值的索引。 例如,如果我有一个数组,,将返回的索引相对应的元素。 问题答案: 我想出的最简单的方法是: 这涉及数组的完整排序。我想知道是否提供了一种进行部分排序的内置方法。到目前为止,我还没有找到一个。 如果此解决方案太慢(尤其是对于小型解决方案n),则可能值得考虑使用进行编码。

  • 问题内容: 我有一个像这样的数组: 如果用户将“ Designation2”作为输入,则代码应返回。 这可能是一个非常简单的问题,但是我是Java的新手。因此,请提出一些建议。 问题答案: 您可以遍历数组中的字符串,并找到与您要查找的字符串匹配的索引。

  • 问题内容: 我正在尝试在字典列表中获取具有最大值的字典的索引,如下所示: 使用以下代码,我可以采用最大大小: 现在如何获取其索引?有没有简单的方法? 测试: 我只是想我可以做到这一点: 这个对吗? 问题答案: 告诉如何计算索引序列的最大值: 这将返回键最高的索引: 如果您一直想要该词典,则可以使用: 并同时获取索引 和 字典,可以在这里使用: 更多演示: 该函数依次传递给输入序列中的每个元素,并将

  • 问题内容: 我正在用Java写一个简单的编辑文本。当用户打开文件时,将在中打开文件。我执行以下操作来保存打开的文件: 将从何处接收值,例如:。 我有一堂课: 现在,在此类中,我需要获取存储在中的值。我怎样才能做到这一点? 问题答案: 要从地图获取所有值: 要从地图中获取所有条目,请执行以下操作: Java 8更新: 处理所有值: 要处理所有条目: