3

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

nxn在一个阶段中,需要产生形状中的平均值,即二维数组值。如果输出的形状一致,也就是说,11x11解决方案中的所有内容都很明显,那么:

element_wise_mean_of_all_arrays.

但是对于这篇文章的问题,数组的形状不同,所以明显的方法不起作用!

我认为使用kron函数可能会有所帮助,但事实并非如此。例如,如果数组的形状是17x17如何制作的21x21。因此,对于来自1x1, 3x3,... 的所有其他人,要构建一个恒定形状的数组,比如说21x21。与目标形状相比,阵列的形状也可能越来越小。那是一个31x31要缩进的数组21x21

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

2D使用 numpy、scipy 等在数组、Python 中执行相同工作的可能有效方法是什么?

更新: 这是下面接受的答案的一些优化版本:


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为尽可能高的性能。

4

1 回答 1

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] 替换为一些自定义函数,例如以 a[idx1][idx2] 为中心的 3x3 矩阵的平均值或一些插值函数。

于 2012-01-24T09:19:16.397 回答