diff --git a/numpy/fft/_pocketfft_umath.cpp b/numpy/fft/_pocketfft_umath.cpp index 44c500ee6fe7..013db5f1d8d4 100644 --- a/numpy/fft/_pocketfft_umath.cpp +++ b/numpy/fft/_pocketfft_umath.cpp @@ -172,6 +172,7 @@ rfft_impl(char **args, npy_intp const *dimensions, npy_intp const *steps, auto plan = pocketfft::detail::get_plan>(npts); auto buffered = (step_out != sizeof(std::complex)); pocketfft::detail::arr> buff(buffered ? nout : 0); + auto nin_used = nin <= npts ? nin : npts; for (size_t i = 0; i < n_outer; i++, ip += si, fp += sf, op += so) { std::complex *op_or_buff = buffered ? buff.data() : (std::complex *)op; /* @@ -186,12 +187,9 @@ rfft_impl(char **args, npy_intp const *dimensions, npy_intp const *steps, * create I0=0. Note that copy_input will zero the In component for * even number of points. */ - copy_input(ip, step_in, nin, &((T *)op_or_buff)[1], nout*2 - 1); + copy_input(ip, step_in, nin_used, &((T *)op_or_buff)[1], nout*2 - 1); plan->exec(&((T *)op_or_buff)[1], *(T *)fp, pocketfft::FORWARD); op_or_buff[0] = op_or_buff[0].imag(); // I0->R0, I0=0 - if (!(npts & 1)) { - op_or_buff[nout - 1].imag(0.0); - } if (buffered) { copy_output(op_or_buff, op, step_out, nout); }