【问题标题】:Efficient searching through matrices高效搜索矩阵
【发布时间】:2017-11-04 11:36:03
【问题描述】:
Y1=scipy.zeros((l,l))
y_test=scipy.zeros((l,l))

for i in range(0,l):
    for j in range(0,l):

        if y_score[i][j]>=0.1:
            Y1[i][j]=1


for i in range(0,l):
    for j in range(0,l):
        if (Y1[i][j]==1) and (v[i][j]==1):
            y_test[i][j]=1

我正在处理大型数据集,我必须搜索矩阵。在最坏的情况下,时间是 O(n^2)。有没有更好更快的方法来使用 numpy 和 scipy 完成上述任务?

输入是 y_score,它是一个 100,000X100,000 的 numpy 数组,其值介于 0 和 1 之间。 v 是一个具有相似维度的稀疏 scipy 矩阵。

【问题讨论】:

  • 输入的具体内容是什么?那些数组? sc 是什么?
  • @Divakar 我编辑了问题。谢谢
  • y_score 呢?
  • 另外,不应该是:(Y1[i][j]==1) and (v[i,j]==1):?
  • 您可能想要编辑问题,因为它指出:v is a sparse scipy matrix

标签: python numpy matrix scipy


【解决方案1】:

您可以简单地创建与比较相对应的掩码,然后将它们转换为浮点数(如果您在该 dtype 中需要它们)以获得所需的输出 -

mask = y_score >= 0.1
Y1 = mask.astype(float)
y_test = (mask & (v==1)).astype(float)

【讨论】:

    【解决方案2】:

    我建议阅读 Numpy 的索引文档: https://docs.scipy.org/doc/numpy/user/basics.indexing.html

    Numpy 擅长批量操作。

    你的例子可以简单地翻译成:

    import scipy
    
    l = 10
    Y1 = scipy.zeros((l, l))
    y_test = scipy.zeros((l, l))
    y_score = scipy.random.rand(l, l)
    v = scipy.random.randint(0, 2, (l, l))
    
    Y1[y_score >= 0.1] = 1
    y_test[(Y1 == 1) & (v == 1)]
    

    【讨论】:

    • 但问题是我的输入数组的尺寸为 100,000X100,000。
    • 好的,如果它不适合内存,您可以处理切片。但也许@Divakar 的答案更适合您的用例?
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多