【问题标题】:Python: Shrink/Extend 2D arrays in fractionsPython:以分数缩小/扩展二维数组
【发布时间】:2012-02-17 12:20:22
【问题描述】:

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

在一个阶段中,需要生成形状为nxn 的平均值,即二维数组值。 如果输出的形状一致,即在11x11 中说全部,则解决方案很明显,所以:

element_wise_mean_of_all_arrays

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

我认为使用kron function 可能会有所帮助,但事实并非如此。例如,如果数组的形状为17x17,如何使其成为21x21。所以对于来自1x13x3、...的所有其他人,要构建一个恒定形状的数组,比如21x21。 与目标形状相比,阵列的形状也可能越来越小。那是 31x31 的数组,要转换成 21x21

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

在 Python 中,使用 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,以获得尽可能高的性能。

【问题讨论】:

  • resize() 返回 [[1,1,1,..,1],[1,1,1,..,1],..,[1,1,1, ...,1]]。它没有像上面那样工作

标签: python multidimensional-array shrink


【解决方案1】:

我不确定我是否完全理解您的尝试,但如果我认为最简单的方法是:

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 矩阵的平均值或一些插值函数。

【讨论】:

  • 谢谢;你的回答很好。我做了一些优化并将新的(定义为函数)放在问题中。再过一段时间,如果在效率上没有更好的解决方案,这当然是我的选择。
  • 我也对一种更有效的方法感到好奇,但我没有看到一种方法可以构建一个 m 矩阵,其中每个元素都需要在不做至少 n 的情况下计算m 次计算。
  • 使用我根据您的回答开发的Fortran 版本的代码(问题上方),性能非常出色。因此,我接受了你的回答,因为它的实现很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2019-11-09
  • 1970-01-01
  • 2020-11-19
相关资源
最近更新 更多