Python:按比例缩小/扩展2D数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:按比例缩小/扩展2D数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1916字,纯文字阅读大概需要3分钟。
内容图文
![Python:按比例缩小/扩展2D数组](/upload/InfoBanner/zyjiaocheng/655/7bc243a63dd843febebc8b070c7bbd6a.jpg)
有2D数字数组作为某些数值过程的输出,形式为1×1、3×3、5×5,…形状,分别对应于不同的分辨率.
在阶段中,需要产生形状为n×n的平均即二维阵列值.
如果输出的形状一致,即以11×11表示全部,则解决方案很明显,因此:
element_wise_mean_of_all_arrays.
对于这篇文章的问题,但是数组的形状不同,因此明显的方法行不通!
我认为使用kron function可能会有所帮助,但事实并非如此.例如,如果数组的形状为17×17,则如何将其制作为21×21.因此,对于所有其他从1×1,3×3,…来构建恒定形状的数组,例如21×21.
也可能是阵列的形状与目标形状相比越来越小.那是一个31×31的数组,将被压缩为21×21.
您可以将问题想象为缩小或扩展图像的非常常见的任务.
在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,以获得最高的性能.
解决方法:
我不确定我是否确切了解您正在尝试什么,但是如果我认为最简单的方法是:
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]
您可以用一些自定义函数(例如,以a [idx1] [idx2]为中心的3×3矩阵的平均值)或某些插值函数来代替b [i] [j] = a [idx1] [idx2].
内容总结
以上是互联网集市为您收集整理的Python:按比例缩小/扩展2D数组全部内容,希望文章能够帮你解决Python:按比例缩小/扩展2D数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。