有2D arrays
个数字作为1x1, 3x3, 5x5, ...
形状的某些数字过程的输出,对应于不同的分辨率。
在一个阶段中,需要生成形状nxn
中的平均即2D阵列值。
如果输出的形状是一致的,即在11x11
中所有的解决方案都很明显,那么:
element_wise_mean_of_all_arrays
。
对于这个帖子的问题,但阵列的形状不同,所以显而易见的方法不起作用!
我认为使用kron
function可能会有所帮助,但事实并非如此。例如,如果数组的形状为17x17
,则如何使其成为21x21
。因此,对于1x1
,3x3
,...的所有其他人来说,要构建一个恒定形状的数组,请说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
,以获得最高性能。
答案 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矩阵的平均值。