代码之家  ›  专栏  ›  技术社区  ›  zo Aoo

有没有其他方法来处理这个涉及大矩阵的问题?

  •  0
  • zo Aoo  · 技术社区  · 3 年前

    假设我已经有了一个非常大的2d矩阵(比如[10000010000]),并且我想创建一个新的矩阵a(比如[101000010000,2]),使得a[i,j,:]=[i,j] 直观的方式如下:

    import numpy as np
    c = np.zeros([10000,10000,2])
    d1,d2 = c.shape[:2]
    for i in range(d1):
        for j in range(d2):
            c[i,j,:] = (i,j)
    
    # it's  time-consuming
    

    然而,这是时间消耗

    我决定使用广播:

    d = np.zeros([10000,10000,2])
    d[:,:,0] = np.arange(10000).reshape(10000,1) + np.zeros(10000)
    d[:,:,1] = np.arange(10000).reshape(1,10000) + np.zeros(10000).T 
    

    它有效。

    但是有其他方法可以做到这一点吗? 我是处理这类大矩阵的新手,所以我决定寻找一些关于它的信息。起初我认为它属于大数据领域。显然,我错了。 我在哪里可以找到一些信息? 非常感谢您的回复和建议。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Mechanic Pig    3 年前

    使用 np.indices 和转置:

    >>> shape = 10, 10
    >>> np.indices(shape, float).transpose(1, 2, 0)
    array([[[0., 0.],
            [0., 1.],
            [0., 2.],
            [0., 3.],
            [0., 4.],
            [0., 5.],
            [0., 6.],
            [0., 7.],
            [0., 8.],
            [0., 9.]],
    
           [[1., 0.],
            [1., 1.],
            [1., 2.],
            [1., 3.],
            [1., 4.],
            [1., 5.],
            [1., 6.],
            [1., 7.],
            [1., 8.],
            [1., 9.]],
    
           [[2., 0.],
            [2., 1.],
            [2., 2.],
            [2., 3.],
            [2., 4.],
            [2., 5.],
            [2., 6.],
            [2., 7.],
            [2., 8.],
            [2., 9.]],
    
           [[3., 0.],
            [3., 1.],
            [3., 2.],
            [3., 3.],
            [3., 4.],
            [3., 5.],
            [3., 6.],
            [3., 7.],
            [3., 8.],
            [3., 9.]],
    
           [[4., 0.],
            [4., 1.],
            [4., 2.],
            [4., 3.],
            [4., 4.],
            [4., 5.],
            [4., 6.],
            [4., 7.],
            [4., 8.],
            [4., 9.]],
    
           [[5., 0.],
            [5., 1.],
            [5., 2.],
            [5., 3.],
            [5., 4.],
            [5., 5.],
            [5., 6.],
            [5., 7.],
            [5., 8.],
            [5., 9.]],
    
           [[6., 0.],
            [6., 1.],
            [6., 2.],
            [6., 3.],
            [6., 4.],
            [6., 5.],
            [6., 6.],
            [6., 7.],
            [6., 8.],
            [6., 9.]],
    
           [[7., 0.],
            [7., 1.],
            [7., 2.],
            [7., 3.],
            [7., 4.],
            [7., 5.],
            [7., 6.],
            [7., 7.],
            [7., 8.],
            [7., 9.]],
    
           [[8., 0.],
            [8., 1.],
            [8., 2.],
            [8., 3.],
            [8., 4.],
            [8., 5.],
            [8., 6.],
            [8., 7.],
            [8., 8.],
            [8., 9.]],
    
           [[9., 0.],
            [9., 1.],
            [9., 2.],
            [9., 3.],
            [9., 4.],
            [9., 5.],
            [9., 6.],
            [9., 7.],
            [9., 8.],
            [9., 9.]]])