예제 #1
0
    def setUp(self):
        self.graph = Graph()

        self.operator_split = OpSplitMaskArray(graph=self.graph)
        self.operator_split.Input.meta.axistags = vigra.AxisTags("txyzc")
예제 #2
0
class TestOpSplitMaskArray(object):
    def setUp(self):
        self.graph = Graph()

        self.operator_split = OpSplitMaskArray(graph=self.graph)
        self.operator_split.Input.meta.axistags = vigra.AxisTags("txyzc")

    def test1(self):
        # Generate a random dataset and see if it we get the right masking from the operator.
        data = numpy.random.random((4, 5, 6, 7, 3)).astype(numpy.float32)
        mask = numpy.zeros(data.shape, dtype=bool)

        # Mask borders of the expected output.
        left_slicing = (mask.ndim - 1) * (slice(None),) + (slice(None, 1),)
        right_slicing = (mask.ndim - 1) * (slice(None),) + (slice(-1, None),)
        for i in xrange(mask.ndim):
            left_slicing = left_slicing[-1:] + left_slicing[:-1]
            right_slicing = right_slicing[-1:] + right_slicing[:-1]

            mask[left_slicing] = True
            mask[right_slicing] = True

        data = numpy.ma.masked_array(
            data,
            mask=mask,
            fill_value=data.dtype.type(numpy.nan),
            shrink=False
        )

        # Provide input read all output.
        self.operator_split.Input.setValue(data)
        output_array = self.operator_split.OutputArray[None].wait()
        output_mask = self.operator_split.OutputMask[None].wait()
        output_fill_value = self.operator_split.OutputFillValue[None].wait()

        assert not isinstance(output_array, numpy.ma.masked_array)
        assert not isinstance(output_mask, numpy.ma.masked_array)
        assert not isinstance(output_fill_value, numpy.ma.masked_array)
        assert output_array.dtype.type == data.dtype.type
        assert output_mask.dtype.type == data.mask.dtype
        assert output_fill_value.dtype.type == data.dtype.type
        assert (
            (data.data == output_array) |
            (numpy.isnan(data.data) & numpy.isnan(output_array))
        ).all()
        assert (data.mask == output_mask).all()
        assert (
            (data.fill_value[()] == output_fill_value) |
            (numpy.isnan(data.fill_value[()]) & numpy.isnan(output_fill_value))
        ).all()

    def test2(self):
        # Generate a dataset and grab chunks of it from the operator. The result should be the same as above.
        data = numpy.random.random((4, 5, 6, 7, 3)).astype(numpy.float32)
        mask = numpy.zeros(data.shape, dtype=bool)

        # Mask borders of the expected output.
        left_slicing = (mask.ndim - 1) * (slice(None),) + (slice(None, 1),)
        right_slicing = (mask.ndim - 1) * (slice(None),) + (slice(-1, None),)
        for i in xrange(mask.ndim):
            left_slicing = left_slicing[-1:] + left_slicing[:-1]
            right_slicing = right_slicing[-1:] + right_slicing[:-1]

            mask[left_slicing] = True
            mask[right_slicing] = True

        data = numpy.ma.masked_array(
            data,
            mask=mask,
            fill_value=data.dtype.type(numpy.nan),
            shrink=False
        )

        # Create array to store results. Don't keep original data.
        output_array = data.data.copy()
        output_array[:] = 0
        output_mask = data.mask.copy()
        output_mask[:] = False

        # Provide input and grab chunks.
        self.operator_split.Input.setValue(data)
        output_array[:2] = self.operator_split.OutputArray[:2].wait()
        output_mask[:2] = self.operator_split.OutputMask[:2].wait()
        output_array[2:] = self.operator_split.OutputArray[2:].wait()
        output_mask[2:] = self.operator_split.OutputMask[2:].wait()
        output_fill_value = self.operator_split.OutputFillValue[None].wait()

        assert not isinstance(output_array, numpy.ma.masked_array)
        assert not isinstance(output_mask, numpy.ma.masked_array)
        assert not isinstance(output_fill_value, numpy.ma.masked_array)
        assert output_array.dtype.type == data.dtype.type
        assert output_mask.dtype.type == data.mask.dtype
        assert output_fill_value.dtype.type == data.dtype.type
        assert (
            (data.data == output_array) |
            (numpy.isnan(data.data) & numpy.isnan(output_array))
        ).all()
        assert (data.mask == output_mask).all()
        assert (
            (data.fill_value[()] == output_fill_value) |
            (numpy.isnan(data.fill_value[()]) & numpy.isnan(output_fill_value))
        ).all()

    def tearDown(self):
        # Take down operators
        self.operator_split.Input.disconnect()
        self.operator_split.OutputArray.disconnect()
        self.operator_split.OutputMask.disconnect()
        self.operator_split.OutputFillValue.disconnect()
        self.operator_split.cleanUp()