예제 #1
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_size_accuracy_large(self, size):
        x = np.random.rand(size, 3) + 1j * np.random.rand(size, 3)
        y1 = fftn(x.real.astype(np.float32))
        y2 = fftn(x.real.astype(np.float64)).astype(np.complex64)

        assert_equal(y1.dtype, np.complex64)
        assert_array_almost_equal_nulp(y1, y2, 2000)
예제 #2
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_float16_input_large(self, size):
        x = np.random.rand(size, 3) + 1j * np.random.rand(size, 3)
        y1 = fftn(x.real.astype(np.float16))
        y2 = fftn(x.real.astype(np.float64)).astype(np.complex64)

        assert_equal(y1.dtype, np.complex64)
        assert_array_almost_equal_nulp(y1, y2, 2e6)
예제 #3
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_definition(self):
        x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
        y = fftn(np.array(x, np.float32))
        assert_(y.dtype == np.complex64,
                msg="double precision output with single precision")

        y_r = np.array(fftn(x), np.complex64)
        assert_array_almost_equal_nulp(y, y_r)
예제 #4
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_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, s=(4, 4))
        assert_array_almost_equal(y, fftn(large_x1))

        y = fftn(small_x, s=(3, 4))
        assert_array_almost_equal(y, fftn(large_x1[:-1]))
예제 #5
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_invalid_sizes(self):
        with assert_raises(ValueError,
                           match="invalid number of data points"
                           r" \(\[1, 0\]\) specified"):
            fftn([[]])

        with assert_raises(ValueError,
                           match="invalid number of data points"
                           r" \(\[4, -3\]\) specified"):
            fftn([[1, 1], [2, 2]], (4, -3))
예제 #6
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_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, s=(4, 4), axes=(-2, -1))
        assert_array_almost_equal(y, fftn(large_x1))
        y = fftn(small_x, s=(4, 4), axes=(-1, -2))

        assert_array_almost_equal(
            y, swapaxes(fftn(swapaxes(large_x1, -1, -2)), -1, -2))
예제 #7
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_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))
예제 #8
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_shape_axes_argument2(self):
        # Change shape of the last axis
        x = numpy.random.random((10, 5, 3, 7))
        y = fftn(x, axes=(-1, ), s=(8, ))
        assert_array_almost_equal(y, fft(x, axis=-1, n=8))

        # Change shape of an arbitrary axis which is not the last one
        x = numpy.random.random((10, 5, 3, 7))
        y = fftn(x, axes=(-2, ), s=(8, ))
        assert_array_almost_equal(y, fft(x, axis=-2, n=8))

        # Change shape of axes: cf #244, where shape and axes were mixed up
        x = numpy.random.random((4, 4, 2))
        y = fftn(x, axes=(-3, -2), s=(8, 8))
        assert_array_almost_equal(y, numpy.fft.fftn(x, axes=(-3, -2),
                                                    s=(8, 8)))
예제 #9
0
def fftn(x, shape=None, axes=None, overwrite_x=False):
    """
    Return multidimensional discrete Fourier transform.

    The returned array contains::

      y[j_1,..,j_d] = sum[k_1=0..n_1-1, ..., k_d=0..n_d-1]
         x[k_1,..,k_d] * prod[i=1..d] exp(-sqrt(-1)*2*pi/n_i * j_i * k_i)

    where d = len(x.shape) and n = x.shape.

    Parameters
    ----------
    x : array_like
        The (N-D) array to transform.
    shape : int or array_like of ints or None, optional
        The shape of the result. If both `shape` and `axes` (see below) are
        None, `shape` is ``x.shape``; if `shape` is None but `axes` is
        not None, then `shape` is ``scipy.take(x.shape, axes, axis=0)``.
        If ``shape[i] > x.shape[i]``, the ith dimension is padded with zeros.
        If ``shape[i] < x.shape[i]``, the ith dimension is truncated to
        length ``shape[i]``.
        If any element of `shape` is -1, the size of the corresponding
        dimension of `x` is used.
    axes : int or array_like of ints or None, optional
        The axes of `x` (`y` if `shape` is not None) along which the
        transform is applied.
        The default is over all axes.
    overwrite_x : bool, optional
        If True, the contents of `x` can be destroyed. Default is False.

    Returns
    -------
    y : complex-valued N-D NumPy array
        The (N-D) DFT of the input array.

    See Also
    --------
    ifftn

    Notes
    -----
    If ``x`` is real-valued, then
    ``y[..., j_i, ...] == y[..., n_i-j_i, ...].conjugate()``.

    Both single and double precision routines are implemented. Half precision
    inputs will be converted to single precision. Non-floating-point inputs
    will be converted to double precision. Long-double precision inputs are
    not supported.

    Examples
    --------
    >>> from scipy.fftpack import fftn, ifftn
    >>> y = (-np.arange(16), 8 - np.arange(16), np.arange(16))
    >>> np.allclose(y, fftn(ifftn(y)))
    True

    """
    shape = _good_shape(x, shape, axes)
    return _pocketfft.fftn(x, shape, axes, None, overwrite_x)
예제 #10
0
파일: test_basic.py 프로젝트: xtchenn/scipy
 def test_random_complex(self, maxnlp, size):
     x = random([size, size]) + 1j * random([size, size])
     assert_array_almost_equal_nulp(ifftn(fftn(x)), x, maxnlp)
     assert_array_almost_equal_nulp(fftn(ifftn(x)), x, maxnlp)
예제 #11
0
파일: test_basic.py 프로젝트: xtchenn/scipy
 def test_no_axes(self):
     x = numpy.random.random((2, 2, 2))
     assert_allclose(fftn(x, axes=[]), x, atol=1e-7)
예제 #12
0
파일: test_basic.py 프로젝트: xtchenn/scipy
 def test_shape_argument_more(self):
     x = zeros((4, 4, 2))
     with assert_raises(ValueError,
                        match="shape requires more axes than are present"):
         fftn(x, s=(8, 8, 2, 1))
예제 #13
0
파일: test_basic.py 프로젝트: xtchenn/scipy
    def test_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)))
        assert_array_almost_equal(fftn(x, axes=(0, 2)), fftn(x, axes=(0, -1)))
        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)
예제 #14
0
파일: test_basic.py 프로젝트: xtchenn/scipy
 def test_definition_float16(self):
     x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
     y = fftn(np.array(x, np.float16))
     assert_equal(y.dtype, np.complex64)
     y_r = np.array(fftn(x), np.complex64)
     assert_array_almost_equal_nulp(y, y_r)
예제 #15
0
파일: test_basic.py 프로젝트: xtchenn/scipy
def direct_rdftn(x):
    return fftn(rfft(x), axes=range(x.ndim - 1))
예제 #16
0
 def test_shape_argument_more(self):
     x = zeros((4, 4, 2))
     with assert_raises(ValueError,
                        match="when given, axes and shape arguments"
                        " have to be of the same length"):
         fftn(x, shape=(8, 8, 2, 1))