将numpy数组从一个(2-D)复制到另一个(3-D)

时间:2014-10-12 16:08:56

标签: python arrays opencv numpy

我试图复制一个数组,将A(2-D)说成另一个数组,说B(3-D)有以下形状

A是m * n数组,B是m * n * p数组

我尝试了以下代码,但速度非常慢,例如1秒/帧

for r in range (0, h):
    for c in range (0, w):
        x = random.randint(0, 20)
        B[r, c, x] = A[r, c]

我还阅读了一些有关花式索引的网站,但我仍然不知道如何在我的网站上应用它。

2 个答案:

答案 0 :(得分:2)

我建议使用数组索引的解决方案。 MNP是每个(m,n)索引数组,指定将从B接收数据的A的m * n个元素。

def indexing(A, p):
    m,n = A.shape
    B = np.zeros((m,n,p), dtype=int)
    P = np.random.randint(0, p, (m,n))
    M, N = np.indices(A.shape)
    B[M,N,P] = A
    return B

用于比较,原始循环和使用shuffle的解决方案

def looping(A, p):
    m, n = A.shape
    B = np.zeros((m,n,p), dtype=int)
    for r in range (m):
        for c in range (n):
            x = np.random.randint(0, p)
            B[r, c, x] = A[r, c]
    return B

def shuffling(A, p):
    m, n = A.shape
    B = np.zeros((m,n,p), dtype=int)
    B[:,:,0] = A
    map(np.random.shuffle, B.reshape(m*n,p))
    return B

对于m,n,p = 1000,1000,20,时间为:

looping:    1.16 s
shuffling: 10 s
indexing:     271 ms

对于小m,n,循环最快。我的索引解决方案需要更多时间来设置,但实际的分配很快。改组解决方案具有与原始解决方案一样多的迭代次数。


MN数组不必已满。它们可以分别是列和行数组

M = np.arange(m)[:,None]
N = np.arange(n)[None,:]

M,N = np.ogrid[:m,:n]

这样可以缩短一些时间,对于小型测试用例而言,这样做比对大型测试用例更为明显。


可重复的版本:

def indexing(A, p, B=None):
    m, n = A.shape
    if B is None:
        B = np.zeros((m,n,p), dtype=int)
    for r in range (m):
        for c in range (n):
            x = np.random.randint(0, p)
            B[r, c, x] = A[r, c]
    return B
indexing(A,p,indexing(A,p))

如果AB的第1个2 dim的大小不同,则必须更改索引范围。 A也不必是2D数组:

B[[0,0,2],[1,1,0],[3,4,5]] = [10,11,12]

答案 1 :(得分:0)

假设h = m,w = n且x = p,这应该与您在示例中的相同:

B[:,:,0]=A
map(np.random.shuffle, B.reshape(h*w,p))  

另请注意,我假设在评论中回答NPE的问题是“是”'