【发布时间】:2012-02-17 12:20:22
【问题描述】:
有2D arrays的数字作为1x1, 3x3, 5x5, ...形形式的一些数值过程的输出,对应不同的分辨率。
在一个阶段中,需要生成形状为nxn 的平均值,即二维数组值。
如果输出的形状一致,即在11x11 中说全部,则解决方案很明显,所以:
element_wise_mean_of_all_arrays。
对于这篇文章的问题,但是数组的形状不同,所以明显的方法不起作用!
我认为使用kron function 可能会有所帮助,但事实并非如此。例如,如果数组的形状为17x17,如何使其成为21x21。所以对于来自1x1、3x3、...的所有其他人,要构建一个恒定形状的数组,比如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