如何在TCL中循环通过向量?

2024-09-27 04:18:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我是tcl新手,不知道如何将这段代码从python翻译成tcl

import numpy as np

g0 = 7.88e12
Eox = np.array([155473, 15573, 1553, 1557473, 5473, 473, 1573, 19553])
E1 = 0.55e6
m = 0.7
fot= 1

D = float(input("rad dose"))

Fy = np.array([(abs(Eox)/(abs(Eox)+E1))**m])
Not = np.array([g0*D*Fy*fot])
Not[Not>6.8e18] = 6.8e18
Nit = (1.7e4*D)+1e10
if Nit > 5e12:
    Nit = 5e12

print(Not)
print(Nit)

Tags: 代码npnotabsarraytclprintfot
1条回答
网友
1楼 · 发布于 2024-09-27 04:18:42

Tcl不处理像numpy那样的值列表(它更接近标准Python),而没有扩展。我记得有这样一个东西,但我没有用过,现在也记不起它的名字了。所以我将使用标准的Tcl。在标准Tcl中,与numpy数组最接近的类比是值列表(尽管这与Python列表或元组有更多的共同点)

我将为您翻译这四行:

Eox = np.array([155473, 15573, 1553, 1557473, 5473, 473, 1573, 19553])

Fy = np.array([(abs(Eox)/(abs(Eox)+E1))**m])
Not = np.array([g0*D*Fy*fot])
Not[Not>6.8e18] = 6.8e18

它们成为:

set Eox {155473 15573 1553 1557473 5473 473 1573 19553}

set Fy [lmap EoxVal $Eox {expr {
    (abs($EoxVal) / abs($EoxVal + $E1)) ** $m
}}]
set Not [lmap FyVal $Fy {expr {
    $g0 * $D * $FyVal * $fot
}}]
set Not [lmap NotVal $Not {expr {
    ($NotVal > 6.8e18) ? 6.8e18 : $NotVal
}}]

使用lmap与numpy在幕后为您在这些阵列上所做的相同。最后两个命令可以组合使用:

set Not [lmap FyVal $Fy {expr {
    min($g0 * $D * $FyVal * $fot, 6.8e18)
}}]

(此外,为了提高清晰度,我将每个lmap/expr命令拆分为多行。您可以编写更紧凑的代码,但它更难阅读。对于任何打算保留5分钟以上的代码,清除代码都是一个非常好的计划。)


其他代码行都是纯基本的东西setputsgetsexpr将满足您的需要。以及令人怀疑的显而易见的if

相关问题 更多 >

    热门问题