561
579
assert_array_almost_equal(y, numpy.fft.fftn(x, axes=(-3, -2), s=(8, 8)))
563
581
def test_shape_argument_more(self):
564
# Test that fftn raise a value error exception when s.shape is longer
582
"""Test that fftn raises ValueError when s.shape is longer than x.shape"""
566
583
x = zeros((4, 4, 2))
568
fx = fftn(x, shape = (8, 8, 2, 1))
569
raise AssertionError("s.shape longer than x.shape succeded, "\
570
"but should not have.")
584
assert_raises(ValueError, fftn, x, shape=(8, 8, 2, 1))
574
587
class _TestIfftn(TestCase):
577
594
def test_definition(self):
578
595
x = np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=self.dtype)
580
assert y.dtype == self.cdtype
597
assert_(y.dtype == self.cdtype)
581
598
assert_array_almost_equal_nulp(y,direct_idftn(x),self.maxnlp)
582
599
x = random((20,26))
583
600
assert_array_almost_equal_nulp(ifftn(x),direct_idftn(x),self.maxnlp)
633
652
except ValueError:
657
class TestOverwrite(object):
659
Check input overwrite behavior of the FFT functions
662
real_dtypes = [np.float32, np.float64]
663
dtypes = real_dtypes + [np.complex64, np.complex128]
665
def _check(self, x, routine, fftsize, axis):
667
y = routine(x2, fftsize, axis)
669
sig = "%s(%s%r, %r, axis=%r)" % (routine.__name__, x.dtype, x.shape,
671
assert_equal(x2, x, err_msg="spurious overwrite in %s" % sig)
673
def _check_1d(self, routine, dtype, shape, axis):
675
if np.issubdtype(dtype, np.complexfloating):
676
data = np.random.randn(*shape) + 1j*np.random.randn(*shape)
678
data = np.random.randn(*shape)
679
data = data.astype(dtype)
681
for fftsize in [8, 16, 32]:
682
self._check(data, routine, fftsize, axis)
685
for dtype in self.dtypes:
686
self._check_1d(fft, dtype, (16,), -1)
687
self._check_1d(fft, dtype, (16, 2), 0)
688
self._check_1d(fft, dtype, (2, 16), 1)
691
for dtype in self.dtypes:
692
self._check_1d(ifft, dtype, (16,), -1)
693
self._check_1d(ifft, dtype, (16, 2), 0)
694
self._check_1d(ifft, dtype, (2, 16), 1)
697
for dtype in self.real_dtypes:
698
self._check_1d(rfft, dtype, (16,), -1)
699
self._check_1d(rfft, dtype, (16, 2), 0)
700
self._check_1d(rfft, dtype, (2, 16), 1)
702
def test_irfft(self):
703
for dtype in self.real_dtypes:
704
self._check_1d(irfft, dtype, (16,), -1)
705
self._check_1d(irfft, dtype, (16, 2), 0)
706
self._check_1d(irfft, dtype, (2, 16), 1)
708
def _check_nd_one(self, routine, dtype, shape, axes):
710
if np.issubdtype(dtype, np.complexfloating):
711
data = np.random.randn(*shape) + 1j*np.random.randn(*shape)
713
data = np.random.randn(*shape)
714
data = data.astype(dtype)
716
def fftshape_iter(shp):
720
for j in (shp[0]//2, shp[0], shp[0]*2):
721
for rest in fftshape_iter(shp[1:]):
727
part_shape = tuple(np.take(shape, axes))
729
for fftshape in fftshape_iter(part_shape):
730
self._check(data, routine, fftshape, axes)
732
# check fortran order: it never overwrites
733
self._check(data.T, routine, fftshape, axes)
735
def _check_nd(self, routine, dtype):
736
self._check_nd_one(routine, dtype, (16,), None)
737
self._check_nd_one(routine, dtype, (16,), (0,))
738
self._check_nd_one(routine, dtype, (16, 2), (0,))
739
self._check_nd_one(routine, dtype, (2, 16), (1,))
740
self._check_nd_one(routine, dtype, (8, 16), None)
741
self._check_nd_one(routine, dtype, (8, 16), (0, 1))
742
self._check_nd_one(routine, dtype, (8, 16, 2), (0, 1))
743
self._check_nd_one(routine, dtype, (8, 16, 2), (1, 2))
744
self._check_nd_one(routine, dtype, (8, 16, 2), (0,))
745
self._check_nd_one(routine, dtype, (8, 16, 2), (1,))
746
self._check_nd_one(routine, dtype, (8, 16, 2), (2,))
747
self._check_nd_one(routine, dtype, (8, 16, 2), None)
748
self._check_nd_one(routine, dtype, (8, 16, 2), (0,1,2))
751
for dtype in self.dtypes:
752
self._check_nd(fftn, dtype)
754
def test_ifftn(self):
755
for dtype in self.dtypes:
756
self._check_nd(ifftn, dtype)
636
759
if __name__ == "__main__":
637
760
run_module_suite()