Пример #1
0
    def bench_random(self, level=5):
        from numpy.fft import fftn as numpy_fftn

        print
        print "    Multi-dimensional Fast Fourier Transform"
        print "==================================================="
        print "          |    real input     |   complex input    "
        print "---------------------------------------------------"
        print "   size   |  scipy  |  numpy  |  scipy  |  numpy "
        print "---------------------------------------------------"
        for size, repeat in [((100, 100), 100), ((1000, 100), 7), ((256, 256), 10), ((512, 512), 3)]:
            print "%9s" % ("%sx%s" % size),
            sys.stdout.flush()

            for x in [random(size).astype(double), random(size).astype(cdouble) + random(size).astype(cdouble) * 1j]:
                y = fftn(x)
                # if size > 500: y = fftn(x)
                # else: y = direct_dft(x)
                assert_array_almost_equal(fftn(x), y)
                print "|%8.2f" % self.measure("fftn(x)", repeat),
                sys.stdout.flush()

                assert_array_almost_equal(numpy_fftn(x), y)
                print "|%8.2f" % self.measure("numpy_fftn(x)", repeat),
                sys.stdout.flush()

            print " (secs for %s calls)" % (repeat)

        sys.stdout.flush()
Пример #2
0
 def check_shape_argument(self):
     small_x = [[1, 2, 3], [4, 5, 6]]
     large_x1 = [[1, 2, 3, 0], [4, 5, 6, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
     y = fftn(small_x, shape=(4, 4))
     assert_array_almost_equal(y, fftn(large_x1))
     y = fftn(small_x, shape=(3, 4))
     assert_array_almost_equal(y, fftn(large_x1[:-1]))
Пример #3
0
 def check_definition(self):
     x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
     y = fftn(x)
     assert_array_almost_equal(y, direct_dftn(x))
     x = random((20, 26))
     assert_array_almost_equal(fftn(x), direct_dftn(x))
     x = random((5, 4, 3, 20))
     assert_array_almost_equal(fftn(x), direct_dftn(x))
Пример #4
0
 def check_shape_axes_argument(self):
     small_x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
     large_x1 = array([[1, 2, 3, 0], [4, 5, 6, 0], [7, 8, 9, 0], [0, 0, 0, 0]])
     y = fftn(small_x, shape=(4, 4), axes=(-1,))
     for i in range(4):
         assert_array_almost_equal(y[i], fft(large_x1[i]))
     y = fftn(small_x, shape=(4, 4), axes=(-2,))
     for i in range(4):
         assert_array_almost_equal(y[:, i], fft(large_x1[:, i]))
     y = fftn(small_x, shape=(4, 4), axes=(-2, -1))
     assert_array_almost_equal(y, fftn(large_x1))
     y = fftn(small_x, shape=(4, 4), axes=(-1, -2))
     assert_array_almost_equal(y, swapaxes(fftn(swapaxes(large_x1, -1, -2)), -1, -2))
Пример #5
0
 def check_random_complex(self):
     for size in [1, 2, 51, 32, 64, 92]:
         x = random([size, size]) + 1j * random([size, size])
         assert_array_almost_equal(ifftn(fftn(x)), x)
         assert_array_almost_equal(fftn(ifftn(x)), x)
Пример #6
0
    def check_axes_argument(self):
        # plane == ji_plane, x== kji_space
        plane1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
        plane2 = [[10, 11, 12], [13, 14, 15], [16, 17, 18]]
        plane3 = [[19, 20, 21], [22, 23, 24], [25, 26, 27]]
        ki_plane1 = [[1, 2, 3], [10, 11, 12], [19, 20, 21]]
        ki_plane2 = [[4, 5, 6], [13, 14, 15], [22, 23, 24]]
        ki_plane3 = [[7, 8, 9], [16, 17, 18], [25, 26, 27]]
        jk_plane1 = [[1, 10, 19], [4, 13, 22], [7, 16, 25]]
        jk_plane2 = [[2, 11, 20], [5, 14, 23], [8, 17, 26]]
        jk_plane3 = [[3, 12, 21], [6, 15, 24], [9, 18, 27]]
        kj_plane1 = [[1, 4, 7], [10, 13, 16], [19, 22, 25]]
        kj_plane2 = [[2, 5, 8], [11, 14, 17], [20, 23, 26]]
        kj_plane3 = [[3, 6, 9], [12, 15, 18], [21, 24, 27]]
        ij_plane1 = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
        ij_plane2 = [[10, 13, 16], [11, 14, 17], [12, 15, 18]]
        ij_plane3 = [[19, 22, 25], [20, 23, 26], [21, 24, 27]]
        ik_plane1 = [[1, 10, 19], [2, 11, 20], [3, 12, 21]]
        ik_plane2 = [[4, 13, 22], [5, 14, 23], [6, 15, 24]]
        ik_plane3 = [[7, 16, 25], [8, 17, 26], [9, 18, 27]]
        ijk_space = [jk_plane1, jk_plane2, jk_plane3]
        ikj_space = [kj_plane1, kj_plane2, kj_plane3]
        jik_space = [ik_plane1, ik_plane2, ik_plane3]
        jki_space = [ki_plane1, ki_plane2, ki_plane3]
        kij_space = [ij_plane1, ij_plane2, ij_plane3]
        x = array([plane1, plane2, plane3])

        assert_array_almost_equal(fftn(x), fftn(x, axes=(-3, -2, -1)))  # kji_space
        assert_array_almost_equal(fftn(x), fftn(x, axes=(0, 1, 2)))
        y = fftn(x, axes=(2, 1, 0))  # ijk_space
        assert_array_almost_equal(swapaxes(y, -1, -3), fftn(ijk_space))
        y = fftn(x, axes=(2, 0, 1))  # ikj_space
        assert_array_almost_equal(swapaxes(swapaxes(y, -1, -3), -1, -2), fftn(ikj_space))
        y = fftn(x, axes=(1, 2, 0))  # jik_space
        assert_array_almost_equal(swapaxes(swapaxes(y, -1, -3), -3, -2), fftn(jik_space))
        y = fftn(x, axes=(1, 0, 2))  # jki_space
        assert_array_almost_equal(swapaxes(y, -2, -3), fftn(jki_space))
        y = fftn(x, axes=(0, 2, 1))  # kij_space
        assert_array_almost_equal(swapaxes(y, -2, -1), fftn(kij_space))

        y = fftn(x, axes=(-2, -1))  # ji_plane
        assert_array_almost_equal(fftn(plane1), y[0])
        assert_array_almost_equal(fftn(plane2), y[1])
        assert_array_almost_equal(fftn(plane3), y[2])
        y = fftn(x, axes=(1, 2))  # ji_plane
        assert_array_almost_equal(fftn(plane1), y[0])
        assert_array_almost_equal(fftn(plane2), y[1])
        assert_array_almost_equal(fftn(plane3), y[2])
        y = fftn(x, axes=(-3, -2))  # kj_plane
        assert_array_almost_equal(fftn(x[:, :, 0]), y[:, :, 0])
        assert_array_almost_equal(fftn(x[:, :, 1]), y[:, :, 1])
        assert_array_almost_equal(fftn(x[:, :, 2]), y[:, :, 2])
        y = fftn(x, axes=(-3, -1))  # ki_plane
        assert_array_almost_equal(fftn(x[:, 0, :]), y[:, 0, :])
        assert_array_almost_equal(fftn(x[:, 1, :]), y[:, 1, :])
        assert_array_almost_equal(fftn(x[:, 2, :]), y[:, 2, :])
        y = fftn(x, axes=(-1, -2))  # ij_plane
        assert_array_almost_equal(fftn(ij_plane1), swapaxes(y[0], -2, -1))
        assert_array_almost_equal(fftn(ij_plane2), swapaxes(y[1], -2, -1))
        assert_array_almost_equal(fftn(ij_plane3), swapaxes(y[2], -2, -1))
        y = fftn(x, axes=(-1, -3))  # ik_plane
        assert_array_almost_equal(fftn(ik_plane1), swapaxes(y[:, 0, :], -1, -2))
        assert_array_almost_equal(fftn(ik_plane2), swapaxes(y[:, 1, :], -1, -2))
        assert_array_almost_equal(fftn(ik_plane3), swapaxes(y[:, 2, :], -1, -2))
        y = fftn(x, axes=(-2, -3))  # jk_plane
        assert_array_almost_equal(fftn(jk_plane1), swapaxes(y[:, :, 0], -1, -2))
        assert_array_almost_equal(fftn(jk_plane2), swapaxes(y[:, :, 1], -1, -2))
        assert_array_almost_equal(fftn(jk_plane3), swapaxes(y[:, :, 2], -1, -2))

        y = fftn(x, axes=(-1,))  # i_line
        for i in range(3):
            for j in range(3):
                assert_array_almost_equal(fft(x[i, j, :]), y[i, j, :])
        y = fftn(x, axes=(-2,))  # j_line
        for i in range(3):
            for j in range(3):
                assert_array_almost_equal(fft(x[i, :, j]), y[i, :, j])
        y = fftn(x, axes=(0,))  # k_line
        for i in range(3):
            for j in range(3):
                assert_array_almost_equal(fft(x[:, i, j]), y[:, i, j])

        y = fftn(x, axes=())  # point
        assert_array_almost_equal(y, x)