微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Numpy 数组上递归放大

如何解决如何在 Numpy 数组上递归放大

我试图证明我生成的数组在多个长度尺度上看起来自相似。为此,我想编写一个函数来打印输入数组的左上角,然后打印该部分的左上角,依此类推指定迭代次数。我写了这个递归函数。但是,输出不是我所期望的。

def zoom(array,max_zoom,zoom_level):
    half_width = int(array.shape[0]/2)
    half_height = int(array.shape[1]/2)
    print(array)

    while zoom_level < max_zoom:
        array = array[:half_width,:half_height]
        zoom_level += 1
        zoom(array,zoom_level)

问题不是打印到所需的级别然后停止,而是数组开始再次变大并且函数在几次额外迭代后停止。

例如 zoom(array,3,0) 应该为 8x8 网格提供以下输出

[[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]] 

[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]

[[0. 0.]
[0. 0.]]

[[0.]]

而是给出:

[[0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[0. 0.]
 [0. 0.]]
[[0.]]
[[0. 0.]
 [0. 0.]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[0. 0.]
 [0. 0.]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

谁能解释为什么这个函数行为不正常?

解决方法

问题出在您的递归函数中。您所做的是为每个递归调用重复相同的过程,从而打印出不必要的结果。

def zoom(array,max_zoom,zoom_level):
    print(array)
    if zoom_level < max_zoom:
        half_width = array.shape[0] // 2
        half_height = array.shape[1] // 2
        array = array[:half_width,:half_height]
        zoom_level += 1
        zoom(array,zoom_level)

A = np.zeros((9,9))

zoom(A,3,0)

输出将是:

[[0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[0. 0.]
 [0. 0.]]
[[0.]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。