【问题标题】:Copy numpy array from one (2-D) to another (3-D)将numpy数组从一个(2-D)复制到另一个(3-D)
【发布时间】:2014-10-12 16:08:56
【问题描述】:

我试图复制一个数组,说 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]

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

【问题讨论】:

  • 您是否真的希望第三个索引是随机的并且因元素而异,或者这只是一个说明?
  • 另外,请整理一下您的符号。你有mnphw20
  • @Marciano 这样做会更快:´B[..., x] = A.copy()
  • @SaulloCastro:在这种情况下无需致电copy
  • @NPE 是的,我希望随机分配第三维。

标签: python arrays opencv numpy


【解决方案1】:

我提出了一个使用数组索引的解决方案。 M,N,P 是每个(m,n) 索引数组,指定将接收来自A 的数据的B 的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,循环是最快的。我的索引解决方案需要更多时间来设置,但实际分配速度很快。改组解决方案的迭代次数与原始解决方案一样多。


M,N 数组不必是满的。它们可以分别是列数组和行数组

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))

如果A 的大小与B 的第一个 2 暗度不同,则必须更改索引范围。 A 也不一定是二维数组:

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

【讨论】:

  • 它有效,谢谢!顺便说一句,我的数组 B 将不断更新,但只有 B 中的一些值被选择更新,而其他值则保留为旧值。你有什么建议吗?
  • 更有理由使用“索引”解决方案。只需将B 初始化移到函数外即可。
  • 我已经将 B 初始化移到了函数之外,我的函数只更新了随机索引中 B 内部的值。但我的观点是,我还希望随机更新一些像素,而其他像素不更新。例如,我有另一个变量,在每个像素处,我将随机化这个变量。如果此变量的值为 1,则该像素将被更新。否则不行。
【解决方案2】:

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

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

另请注意,我假设 Cmets 中 NPE 问题的答案是“是”

【讨论】:

  • 在我的计时中,这比原始循环 (5-10x) 慢。 map 隐藏了 h*w 次循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
相关资源
最近更新 更多