需要一种有效的方法将较小的Numpy数组广播到较大的数组中

时间:2019-05-11 01:23:25

标签: python numpy for-loop numpy-broadcasting

TL; DR:我正在寻找一种无需使用循环即可缩短以下代码的方法

# x = [m, n] Numpy array
# y = [m, t*n] Numpy array of zeros (placeholder)
for i in range(m):
    for j in range(n):
        y[i, t*j:t*(j+1)] = x[i, j]

更多说明:我想做的是将2D数组复制/广播到更大的数组中,该数组在第二维中重复t次。上面的代码运行良好,尽管我想通过避免使用循环来保持效率。

2 个答案:

答案 0 :(得分:1)

np.repeat(x,n,axis=1)

这无需任何零数组初始化即可工作!假设您只想在列中重复上一个数组。

答案 1 :(得分:0)

如果我要使用numpy复制您的函数,我会这样做:

import numpy as np

a = np.arange(float(m * n)).reshape(m, n)

def expand_array(a, t):
    m, n = a.shape
    return np.repeat(a[:, -1], t * n).reshape(m, t * n)

def op_func(a, t):
    m, n = a.shape
    y = np.zeros((m, n * t))
    for i in range(m):
        for j in range(n):
            y[i, :] = x[i, j]

    return y

(expand_array(a, 10) == op_func(a, 10)).all()

输出:

True

但是,正如我在评论中指出的那样,这实际上跳过了除最后一列之外的所有列。因此,我怀疑您想要的东西更像是以下两种之一:

def repeat_expand_array(a, t):
    m, n = a.shape
    return np.repeat(a, t).reshape(m, t * n)

def tile_expand_array(a, t):
    m, n = a.shape
    return np.tile(a, t).reshape(m, t * n)

print(repeat_expand_array(a, 3), '\n')
print(tile_expand_array(a, 3))

输出:

[[0. 0. 0. 1. 1. 1.]
 [2. 2. 2. 3. 3. 3.]
 [4. 4. 4. 5. 5. 5.]] 

[[0. 1. 0. 1. 0. 1.]
 [2. 3. 2. 3. 2. 3.]
 [4. 5. 4. 5. 4. 5.]]