Как перебирать вектор в TCL?

#python #numpy #tcl

Вопрос:

Я новичок в 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)
 

Комментарии:

1. Пожалуйста, опубликуйте TCL, который вы написали до сих пор. Я помогу тебе, но я не буду писать все это за тебя…

2. @Z4-уровень это очень плохо. Если бы я знал, что это помогло бы, я бы опубликовал это ! ! ( набор g 7.88e12 набор m 0,7 набор E1 0.55e6 набор Eox {1e5 1e5 1e5 1e5 1e5 1e5 1e5 1e5 1e5 1e5} набор Fy [0 0 0 0 0 0 0 0 ] для {set i 0} { $i

Ответ №1:

Tcl не обрабатывает списки значений, как numpy (это ближе к стандартному Python), без расширения. Я помню, что была такая штука, но я ею не пользовался и сейчас не могу вспомнить название. Поэтому я буду использовать стандартный Tcl. Ближайшей аналогией для массива numpy в стандартном Tcl является список значений (хотя это больше похоже на список или кортеж 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 минут.)


Остальные строки кода являются чисто базовыми. set , puts , gets и expr будет делать то, что вам нужно. И подозрительно очевидное if .

Комментарии:

1. Я использую numpy на работе, и мне это не нравится, потому что с его помощью чрезвычайно сложно создать код, который не был бы очень загадочным. Это легко становится вопросом догадок, пока не произойдет волшебство. Я ненавижу это.

2. lmap это просто коллекционирование foreach

3. Да , я знаю, я не всегда думаю об его использовании… и ваш ответ показывает отличный пример его использования . Спасибо

4. Списки Re и кортежи, списки Tcl имеют семантику значений, как и кортежи Python, но операции, которые имитируют многое из того, что делают списки Python. Это основано на семантике низкого уровня копирования при записи, которая, в свою очередь, зависит от производительности модели потоковой передачи; это область, в которой Tcl может использовать решение, недоступное Python. Тонкая штука.