将 IDL 转换为 Python,逐字翻译并使其 Pythonic

问题描述 投票:0回答:1

我正在将一些旧的 IDL 代码翻译成 python。我是个新手,希望(仍然希望)通过跳入一些 IDL 代码,我可以更快地学习该语言。我从看似“最简单”的功能开始。该函数接受给定的“psd”并从中创建模拟地图。不太确定“psd”代表什么,但我们处于天文背景中,因此可以安全地假设它意味着功率谱密度......对于我们的目的来说,这是一个任何形状的二维数组。在使用一些生成假大气 PSD 的代码之前,我使用了较小的 2x3、3x4 和 4x4 数组。事情进展顺利......不太顺利,但在事情发生之前我在代码中比现在做得更进一步。我对 IDL 和 numpy 的经验都非常有限(astropy 通常为我处理很多 numpy 的东西,所以我从来不需要直接编写新的东西),所以我真的很难弄清楚到底出了什么问题。解决这个问题的问题是因为我不知道 IDL 代码的哪些部分需要保留在 python 中。

所以,以下是 IDL 代码以及我尝试将所述 IDL 代码翻译成 python 的尝试。

IDL:

;we've allowed the map_ft too much freedom, so we need to make
;sure it will produce a real map

;obviously the dc component is real
map_ft[0,0] = sign(real_part(map_ft[0,0])) * abs(map_ft[0,0])

;if map_dim1 is divisible by 2 then we need to reverse
;along the extra column at the highest frequency
if (map_dim1 mod 2L) eq 0L then begin
  map_ft[map_dim1/2L,0L] = sign(real_part(map_ft[map_dim1/2L,0L])) * $
    abs(map_ft[map_dim1/2L,0L])
  map_ft[map_dim1/2L,1L:(map_dim2/2L - 1L + (map_dim2 mod 2L))] = $
    conj(reverse(reform(map_ft[map_dim1/2L,map_dim2/2L+1L:*])))
endif

Python:

# we've allowed the map_ft too much freedom, so we need to make
# sure it will produce a real map

# obviously the dc component is real (no clue what dc means btw)

map_ft[0, 0] = np.sign(map_ft[0, 0].real) * np.abs(map_ft[0, 0])

print(row_len, ' // 2 + (', row_len % 2, ') = ', (row_len // 2 + (row_len % 2)))

#if col_len is divisible by 2 then we need to reverse
#along the extra column at the highest frequency
if (col_len % 2) == 0: # working on columns 
    mid_col = col_len // 2
    map_ft[0, mid_col] = np.sign(map_ft[0, mid_col].real) * np.abs(map_ft[0, mid_col])
    

    end_row = (row_len // 2 + row_len % 2)
    map_ft[1 :row_len // 2 - 1 + (row_len % 2), mid_col] = \
        np.conj(np.flip(np.squeeze(map_ft[row_len // 2 + 1 :, mid_col])))

注意:map_dim2, mapdim1 = row_len, col_len = psd.shape & map_ft 是一个与 psd 形状相同的复杂数组(在这种特殊情况下,psd 是一个大小为 (4096, 2048) 的数组

错误发生在 np.conj(...) 行并显示: ValueError: 无法将输入数组从形状 (2047,) 广播到形状 (2046,)。

最后我们可以得到我到底需要帮助的内容:我想知道逐字翻译 IDL 代码有多么必要,或者是否有更多 Pythonic 或更简洁的方法来编写此代码。我对自己尝试和简化事情犹豫不决,因为以我有限的知识,这实际上意味着放弃原始代码并试图理解该代码所基于的更难学习的数学概念(最终目标是获得旧的代码)大气过滤代码已启动并正在运行,所以我还没有学过很多 fft 和可怕的数学。此外,在有人问之前,我还没有 IDL 许可证(至少还没有),不幸的是无法检查代码的作用。现在在 IDL 中运行,假装这是不可能的,希望情况会改变。

我希望能够帮助您使这段代码更加Python化,因为我从逆向工作中学习得很快,并且任何翻译这段代码的帮助都将不胜感激。

python numpy translate idl
1个回答
0
投票

IDL 切片包含端点,而 Python 切片不包含端点。考虑到这一点,你应该改变这一点:

  map_ft[1 :row_len // 2 - 1 + (row_len % 2), mid_col] = \

对此:

  map_ft[1 :row_len // 2 + (row_len % 2), mid_col] = \
© www.soinside.com 2019 - 2024. All rights reserved.