Проблема с использованием значения numpy.float32 в предложении if - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть простое тестовое приложение для GNUradio, в котором я пытаюсь преобразовать входное значение в диапазоне -180 ... 180 в диапазон 0 ... 360.Я написал код Python и код QA для этого, но, похоже, не могу заставить операторы if-else работать должным образом.

Кажется, проблема в том, что предложение if видит только первый элемент теста src_dataвектор, потому что я использую input_elements [0] [0].Я попытался использовать input_elements [0], но в этом случае я получаю сообщение об ошибке при сравнении массива с целым числом.Как решить эту проблему?

Блок в Python выглядит следующим образом:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy
from gnuradio import gr

class convert_ff(gr.sync_block):
    """
    docstring for block convert_ff
    """
    def __init__(self):
        gr.sync_block.__init__(self,
            name="convert_ff",
            in_sig=[numpy.float32],
            out_sig=[numpy.float32])


    def work(self, input_items, output_items):
    print input_items[:][0]
    out = output_items[0]

    if input_items[0][0] < 0:
        out[:]=360+input_items[0]
        print "negative value processed"
    else:
        out[:]=input_items[0]

    return len(output_items[0])

И код QA выглядит следующим образом:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gnuradio import gr, gr_unittest
from gnuradio import blocks
from convert_ff import convert_ff

class qa_convert_ff (gr_unittest.TestCase):

    def setUp (self):
        self.tb = gr.top_block ()

    def tearDown (self):
        self.tb = None

        def test_001_t (self):
        src_data = (20,90,180,280,-20,-90,-190)
        print "This is source data"
        print src_data
        expected_result = (20,90,180,280,340,270,170)
        src=blocks.vector_source_f(src_data)
        convert=convert_ff()
        snk=blocks.vector_sink_f()
        self.tb.connect(src,convert)
        self.tb.connect(convert,snk)
        self.tb.run ()
        # check data
        self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)


if __name__ == '__main__':
    gr_unittest.run(qa_convert_ff, "qa_convert_ff.xml")

1 Ответ

0 голосов
/ 10 декабря 2018

Как правило, для расширения оператора if на массив numpy.array, лучшим решением является использование маски, полученной, например, путем сравнения массива с целым числом (или с другим массивом того же размера):

mask = input_items[0] < 0

маска является логическим массивом того же измерения.Затем вы можете использовать только выбор массива с помощью маски:

out[mask] = 360+input_items[mask]

numpy.logical_not () - это быстрый способ получить немаску:

out[numpy.logical_not(mask)] = input_items[numpy.logical_not(mask)]

Ваша рабочая функция должна быть:

def work(self, input_items, output_items):
    print input_items[:][0]
    out = output_items[0]

    mask = input_items[0] < 0
    out[mask] = 360+input_items[mask]
    out[numpy.logical_not(mask)] = input_items[numpy.logical_not(mask)]

    return len(output_items[0])

Вы можете сделать еще короче, не сохраняя маску:

def work(self, input_items, output_items):

    out = input_items[0].copy()
    out[out < 0] += 360.  
    return out
...