@@ -321,7 +321,7 @@ def _fft1d_impl(x, n=None, axis=-1, overwrite_arg=False, direction=+1, double fs
321321 # so we cast to complex double and operate in place
322322 try :
323323 x_arr = < cnp .ndarray > cnp .PyArray_FROM_OTF (
324- x_arr , cnp .NPY_CDOUBLE , cnp .NPY_BEHAVED )
324+ x_arr , cnp .NPY_CDOUBLE , cnp .NPY_BEHAVED | cnp . NPY_ENSURECOPY )
325325 except :
326326 raise ValueError ("First argument must be a complex or real sequence of single or double precision" )
327327 x_type = cnp .PyArray_TYPE (x_arr )
@@ -545,7 +545,7 @@ def _rr_fft1d_impl2(x, n=None, axis=-1, overwrite_arg=False, double fsc=1.0):
545545 else :
546546 try :
547547 x_arr = < cnp .ndarray > cnp .PyArray_FROM_OTF (
548- x_arr , cnp .NPY_DOUBLE , cnp .NPY_BEHAVED )
548+ x_arr , cnp .NPY_DOUBLE , cnp .NPY_BEHAVED | cnp . NPY_ENSURECOPY )
549549 except :
550550 raise TypeError ("1st argument must be a real sequence" )
551551 x_type = cnp .PyArray_TYPE (x_arr )
@@ -601,7 +601,7 @@ def _rr_ifft1d_impl2(x, n=None, axis=-1, overwrite_arg=False, double fsc=1.0):
601601 # so we cast to complex double and operate in place
602602 try :
603603 x_arr = < cnp .ndarray > cnp .PyArray_FROM_OTF (
604- x_arr , cnp .NPY_DOUBLE , cnp .NPY_BEHAVED )
604+ x_arr , cnp .NPY_DOUBLE , cnp .NPY_BEHAVED | cnp . NPY_ENSURECOPY )
605605 except :
606606 raise ValueError ("First argument should be a real or a complex sequence of single or double precision" )
607607 x_type = cnp .PyArray_TYPE (x_arr )
@@ -669,7 +669,7 @@ def _rc_fft1d_impl(x, n=None, axis=-1, overwrite_arg=False, double fsc=1.0):
669669 else :
670670 # we must cast the input to doubles and allocate the output,
671671 try :
672- requirement = cnp .NPY_BEHAVED
672+ requirement = cnp .NPY_BEHAVED | cnp . NPY_ENSURECOPY
673673 if x_type is cnp .NPY_LONGDOUBLE :
674674 requirement = requirement | cnp .NPY_FORCECAST
675675 x_arr = < cnp .ndarray > cnp .PyArray_FROM_OTF (
@@ -981,7 +981,14 @@ def _direct_fftnd(x, overwrite_arg=False, direction=+1, double fsc=1.0):
981981 in_place = 1 # a copy was made, so we can work in place.
982982
983983 x_type = cnp .PyArray_TYPE (x_arr )
984- assert ( x_type == cnp .NPY_CDOUBLE or x_type == cnp .NPY_CFLOAT or x_type == cnp .NPY_DOUBLE or x_type == cnp .NPY_FLOAT );
984+ if (x_type == cnp .NPY_CDOUBLE or x_type == cnp .NPY_CFLOAT or x_type == cnp .NPY_DOUBLE or x_type == cnp .NPY_FLOAT ):
985+ pass
986+ else :
987+ x_arr = < cnp .ndarray > cnp .PyArray_FROM_OTF (
988+ x_arr , cnp .NPY_CDOUBLE , cnp .NPY_BEHAVED | cnp .NPY_ENSURECOPY )
989+ x_type = cnp .PyArray_TYPE (x_arr )
990+ assert x_type == cnp .NPY_CDOUBLE
991+ in_place = 1
985992
986993 if in_place :
987994 in_place = 1 if x_type == cnp .NPY_CDOUBLE or x_type == cnp .NPY_CFLOAT else 0
@@ -1076,7 +1083,7 @@ def _fftnd_impl(x, shape=None, axes=None, overwrite_x=False, direction=+1, doubl
10761083 if _direct :
10771084 return _direct_fftnd (x , overwrite_arg = overwrite_x , direction = direction , fsc = fsc )
10781085 else :
1079- if (shape is None and x .dtype in [np .complex64 , np .complex128 , np .float32 , np .float64 ]):
1086+ if (shape is None and x .dtype in [np .csingle , np .cdouble , np .single , np .double ]):
10801087 x = np .asarray (x )
10811088 res = np .empty (x .shape , dtype = _output_dtype (x .dtype ))
10821089 return iter_complementary (
0 commit comments