Python:以分数缩小/扩展2D数组

时间:2012-01-24 08:08:58

标签: python multidimensional-array shrink

2D arrays个数字作为1x1, 3x3, 5x5, ...形状的某些数字过程的输出,对应于不同的分辨率。

在一个阶段中,需要生成形状nxn中的平均即2D阵列值。 如果输出的形状是一致的,即在11x11中所有的解决方案都很明显,那么:

element_wise_mean_of_all_arrays

对于这个帖子的问题,但阵列的形状不同,所以显而易见的方法不起作用!

我认为使用kron function可能会有所帮助,但事实并非如此。例如,如果数组的形状为17x17,则如何使其成为21x21。因此,对于1x13x3,...的所有其他人来说,要构建一个恒定形状的数组,请说21x21。 同样可能的是,与目标形状相比,阵列的形状更小且更大。这是一个31x31的数组,可以变成21x21

你可以把这个问题想象成一个非常常见的图像任务,缩小或扩展。

使用numpy,scipy等在2D数组上执行相同作业的有效方法是什么?

更新 以下是接受的答案的优化版本:


def resize(X,shape=None):
    if shape==None:
        return X
    m,n = shape
    Y = np.zeros((m,n),dtype=type(X[0,0]))
    k = len(X)
    p,q = k/m,k/n
    for i in xrange(m):
        Y[i,:] = X[i*p,np.int_(np.arange(n)*q)]
    return Y

它完美无缺,但是你们都同意它在效率方面是最佳选择吗?如果没有任何改善?


# Expanding ---------------------------------

>>> X = np.array([[1,2,3],[4,5,6],[7,8,9]])
[[1 2 3]
 [4 5 6]
 [7 8 9]]

>>> resize(X,[7,11])
[[1 1 1 1 2 2 2 2 3 3 3]
 [1 1 1 1 2 2 2 2 3 3 3]
 [1 1 1 1 2 2 2 2 3 3 3]
 [4 4 4 4 5 5 5 5 6 6 6]
 [4 4 4 4 5 5 5 5 6 6 6]
 [7 7 7 7 8 8 8 8 9 9 9]
 [7 7 7 7 8 8 8 8 9 9 9]]

# Shrinking ---------------------------------

>>> X = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]

>>> resize(X,(2,2))
[[ 1  3]
 [ 9 11]]

最后注意事项:上述代码可以轻松转换为Fortran,以获得最高性能。

1 个答案:

答案 0 :(得分:3)

我不确定我到底知道你在想什么,但如果我认为最简单的方法是:

wanted_size = 21
a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
b = numpy.zeros((wanted_size, wanted_size))

for i in range(wanted_size):
    for j in range(wanted_size):
        idx1 = i * len(a) / wanted_size
        idx2 = j * len(a) / wanted_size
        b[i][j] = a[idx1][idx2]

你可以用一些自定义函数替换b [i] [j] = a [idx1] [idx2],例如以[idx1] [idx2]或某些插值函数为中心的3x3矩阵的平均值。