有一些数字以形状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
为尽可能高的性能。