【问题标题】:exchanging values of 2 maps 2D arrays in ipython,在 ipython 中交换 2 个映射 2D 数组的值,
【发布时间】:2015-04-06 01:21:52
【问题描述】:

我是python初学者,写了一段代码:

g=rand_image
for i in range(100):
    for j in range (100):
        G = np.fft.fft2(g)
        theta = angle(G)
        G_prim = image ** 0.5 * exp(1j * theta)
        g_prim = np.fft.ifft2(G_prim)
        for k in range(300):
            for l in range(300):
                if g_prim[k, l].imag > 1e-8 or g_prim[k, l] < 0:
                    g[k,l]=g[k,l]-(2-0.02*i)*g_prim[k,l]
                else:
                    g[k ,l] = g_prim[k,l]

我比较了两张图片,rand_image 和 image。运行这样的代码需要 2 小时。我想让它更快地以某种方式替换底部的 2 个循环(比较 2 个大小为 300px*300px 的图像),也许是 2 张图片的地图并替换某些值?虽然我不确定这是否可能。

我需要增加 i 的值并为每个 i 值多次运行代码。

【问题讨论】:

  • 您应该至少摆脱内部循环,使用 numpy 数组研究条件赋值。或者至少只循环通过满足条件的索引列表。也许这有帮助:stackoverflow.com/questions/3409255/…
  • 这不是很有用,因为我不会做一个简单的动作,比如为满足特殊条件的元素添加独立值。我实际上必须拥有这些元素的坐标(准确地说是像素),以便我可以将这些元素与第二张图片中相同坐标的元素进行比较:g[k,l]=g[k,l]-( 2-0.02*i)*g_prim[k,l]
  • 什么是theta?缩放器?和image?
  • 对于i,j 的不同值,g[k,l] 被多次覆盖 - 这是您的意图吗?这看起来像是在浪费无意义的计算。 k,l 循环是否正确缩进?
  • theta 是复数的相位。

标签: python dictionary nested-loops


【解决方案1】:
                              ^ ^
for i in range(100):          | |
    for j in range (100):     | |
        G = np.fft.fft2(g) #--- |
        theta = angle(G) #-------

j 套件中的前两个语句不使用ij,因此将它们移出循环。


            if g_prim[k, l].imag > 1e-8 or g_prim[k, l] < 0:
                g[k,l]=g[k,l]-(2-0.02*i)*g_prim[k,l]
            else:
                g = g_prim

在这个最里面的循环套件中,如果满足条件,您会重复为 g 的各个 像素 分配不同的值。

  • g_prim 依赖于j,因此条件仅依赖于j
  • 套件中的计算仅依赖于i

分配的值使用最外层循环的值i,但条件不使用。对于导致 True 条件的每个 j,将有 100 个 i

  • 如果条件在j 等于2 时满足,那么将有一百个i,j 对满足条件 - (0,2), (1,2), ... (99,2)
  • k,l 循环的每次迭代都会在满足条件时分配给 g[k,l]
  • 唯一重要的 ii 等于 99,因为当 j 为 2 时,它将覆盖之前的每个计算。

最终影响是只有i 的最终值(99) 很重要。你做了很多浪费的操作。

如果条件不满足,更糟糕的是,您会覆盖所有以前的单独分配,使其无用。

它实际上看起来好像整个外部循环是多余的并且可以被丢弃 - 除了条件套件 - g[k,l]=g[k,l]-(2-0.02*i)*g_prim[k,l] 之外,i 没有在任何地方使用。

如果您的示例如实呈现,则可以按照 @nio 的建议使用 boolean indexing 替换内部的两个 (k,l) 循环。

制作一个代表您的状况及其逆向

的面具
mask = np.logical_or(g_prim.imag > 1e-8, g_prim < 0)
not_mask = np.logical_not(mask)

满足条件时使用掩码进行赋值

#(2-0.02*i) .. i = 99!!
k = 2 - .02 * 99
g[mask] = g[mask] - k*g_prim[mask]

假设您不打算覆盖之前的条件赋值, 使用反向掩码来完成其余的分配。

g[not_mask] = g_prim[not_mask]

【讨论】:

  • i用于计算g,用于计算theta(相位),theta变化缓慢。我会尝试使用面具,这可能会使事情变得更快。我不确定我能用 j 做什么。我现在对 j 所做的是更改 g 的那些满足条件的元素,然后我执行“j”循环并再次检查它们是否转换得很好,或者我是否必须对它们施加物理约束并再次运行。我发现如果没有 j 循环或迭代次数很少,它就不能正常工作。当然你是对的,我没有复制那个,我想制作最终的“其他”条件 g[k,l]=g_prim[k,l]
  • 唯一使用i的地方是g[k,l]=g[k,l]-(2-0.02*i)*g_prim[k,l]
  • @Leukonoe pow_spec_img 是什么?它是什么数据类型?有多少维?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多