我有一个针对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")
答案 0 :(得分:0)
通常将“ 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