Взятие двух выходов от двух разных узлов и передача их в виде списка другому узлу как один единственный вход - PullRequest
1 голос
/ 24 февраля 2020

это Пабло!

Я пытаюсь сделать сценарий для DTI. У меня уже есть это с функциями и nipype, но теперь я пытаюсь с узлами, но есть один узел, которому нужен список из двух входов - Merge () - для объединения обоих изображений. Однако он принимает только один вход, а метод connect () не позволяет вводить несколько входов одновременно. В этой функции она также не позволяет мне делать это отдельно, и при попытке использовать util.merge выдает ошибку.

Мне интересно, могу ли я взять два входа с выходов двух разных узлов каждый и объединить их в список с другим узлом, может быть, и передать его в узел, который принимает список в качестве входных данных. Или, может быть, есть другой способ определить узел, который позволяет это?

Кто-нибудь вообще что-нибудь знает?

Заранее большое спасибо

1 Ответ

0 голосов
/ 05 марта 2020

Если я правильно понял, вы просто хотите объединить два элемента в списке.

Это то, для чего создан интерфейс слияния. Вам просто нужно указать количество входов при инициализации, как описано в do c. Опции no_flatten и ravel_input помогут вам, если входные данные представляют собой списки, которые часто могут быть.

РЕДАКТИРОВАТЬ: небольшой пример:

from nipype import Node, Workflow
from nipype.interfaces.utility import Function, Merge

#create a workflow
example_wf = Workflow('merging_example')

#this function just injects stuff in the pipeline
def func_stuffSource(stuff):
    return stuff

sourceA=Node(Function(input_names=["stuff"], 
                      output_names=["returnedStuff"], 
                      function=func_stuffSource), 
             name='sourceA_node')
sourceB=Node(Function(input_names=["stuff"], 
                      output_names=["returnedStuff"], 
                      function=func_stuffSource), 
             name='sourceB_node')

merger = Node(Merge(2), name='merger_node')

#we just give stuff to inject to the two nodes
sourceA.inputs.stuff=['a0', 'a1', 'a2']
sourceB.inputs.stuff=['b0', 'b1', 'b2', 'b3']

example_wf.connect([
    ( sourceA, merger, [('returnedStuff' , 'in1')]), 
    ( sourceB, merger, [('returnedStuff' , 'in2')])
])

#simple function to print whatever the node gets
def printStuff(stuff):
    from nipype import logging
    logger = logging.getLogger("nipype.interface")
    logger.info(str(stuff))

printer = Node(Function(input_names=['stuff'], 
                        output_names=[], 
                        function=printStuff), 
               name='print_node')

example_wf.connect([ 
    (merger, printer, [('out', 'stuff')]) 
])


example_wf.run()

РЕЗУЛЬТАТ:

200306-08:32:22,463 nipype.workflow INFO:
         Workflow merging_example settings: ['check', 'execution', 'logging', 'monitoring']
200306-08:32:22,475 nipype.workflow INFO:
         Running serially.
200306-08:32:22,476 nipype.workflow INFO:
         [Node] Setting-up "merging_example.sourceB_node" in "/tmp/tmpzfklhqwq/merging_example/sourceB_node".
200306-08:32:22,484 nipype.workflow INFO:
         [Node] Running "sourceB_node" ("nipype.interfaces.utility.wrappers.Function")
200306-08:32:22,491 nipype.workflow INFO:
         [Node] Finished "merging_example.sourceB_node".
200306-08:32:22,491 nipype.workflow INFO:
         [Node] Setting-up "merging_example.sourceA_node" in "/tmp/tmppssiddpk/merging_example/sourceA_node".
200306-08:32:22,496 nipype.workflow INFO:
         [Node] Running "sourceA_node" ("nipype.interfaces.utility.wrappers.Function")
200306-08:32:22,501 nipype.workflow INFO:
         [Node] Finished "merging_example.sourceA_node".
200306-08:32:22,502 nipype.workflow INFO:
         [Node] Setting-up "merging_example.merger_node" in "/tmp/tmp_h6t6h7o/merging_example/merger_node".
200306-08:32:22,505 nipype.workflow INFO:
         [Node] Running "merger_node" ("nipype.interfaces.utility.base.Merge")
200306-08:32:22,511 nipype.workflow INFO:
         [Node] Finished "merging_example.merger_node".
200306-08:32:22,511 nipype.workflow INFO:
         [Node] Setting-up "merging_example.print_node" in "/tmp/tmpg4zggeq6/merging_example/print_node".
200306-08:32:22,517 nipype.workflow INFO:
         [Node] Running "print_node" ("nipype.interfaces.utility.wrappers.Function")
200306-08:32:22,518 nipype.interface INFO:
         ['a0', 'a1', 'a2', 'b0', 'b1', 'b2', 'b3']
200306-08:32:22,522 nipype.workflow INFO:
         [Node] Finished "merging_example.print_node".

Обратите внимание, что наши списки правильно объединены. Чтобы проверить это самостоятельно, вы можете создать другие узлы принтера и подключить их к выходам sourceA и sourceB

...