C# 中 NumPy 的 fftn 与 pythonnet

问题描述 投票:0回答:1

我正在使用

pythonnet
将 Python 代码集成到我的 C# 程序中。具体来说,我尝试在复杂数组上应用快速傅里叶变换(FFT)。虽然代码在 Python 中完美运行,但在尝试在 C# 中使用它时遇到了奇怪的错误。错误消息表明输入必须是实数而不是复数,这看起来很矛盾。

这是 C# 代码片段:

using System.Globalization;
using System.Net.Mime;
using System.Numerics;
using Python.Runtime;

static void Initialize()
{
    string pythonDll = @"C:\Users\Mohsen\AppData\Local\Programs\Python\Python39\python39.dll";
    Environment.SetEnvironmentVariable("PYTHONNET_PYDLL", pythonDll);
    PythonEngine.Initialize();    
}


Initialize();
Complex[] complexes = [
    new Complex(1.0, 2.0),
    new Complex(3.0, 4.0),
    new Complex(5.0, 6.0),
    new Complex(5.0, 6.0)

];
List<Complex> comlist = new List<Complex>(complexes);


using (Py.GIL())
{
    dynamic lst = new PyList();
    lst.append(2);
    lst.append(2);
    
    dynamic tuple = PyTuple.AsTuple(lst);
    
    dynamic np = Py.Import("numpy");
    dynamic rawData = np.array(comlist);
    rawData.reshape(tuple);
    dynamic k = np.reshape(a: rawData.T, newshape:tuple, order:'F');

    k = np.fft.fftshift(k);
    k = np.fft.fftn(k);

    k = np.fft.fftshift(k);
    k = np.rot90(k);
    k = np.flip(k, axis : 0);
    
    
    k = np.flip(np.rot90(np.fft.fftshift(np.fft.fftn(np.fft.fftshift(k)))));
    Console.WriteLine(k.shape);
}

这是遇到的异常:

Unhandled exception. Python.Runtime.PythonException: must be real number, not Complex
  File "C:\Users\Mohsen\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\fft\_pocketfft.py", line 74, in _raw_fft
    r = pfi.execute(a, is_real, is_forward, fct)
  File "C:\Users\Mohsen\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\fft\_pocketfft.py", line 185, in fft
    output = _raw_fft(a, n, axis, False, True, inv_norm)
  File "<__array_function__ internals>", line 5, in fft
  File "C:\Users\Mohsen\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\fft\_pocketfft.py", line 652, in _raw_fftnd
    a = function(a, n=s[ii], axis=axes[ii], norm=norm)
  File "C:\Users\Mohsen\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\fft\_pocketfft.py", line 755, in fftn
    return _raw_fftnd(a, s, axes, fft, norm)
  File "<__array_function__ internals>", line 5, in fftn
   at Python.Runtime.PythonException.ThrowLastAsClrException()
   at Python.Runtime.PyObject.Invoke(PyTuple args, PyDict kw)
   at Python.Runtime.PyObject.InvokeMethod(String name, PyTuple args, PyDict kw)
   at Python.Runtime.PyObject.TryInvokeMember(InvokeMemberBinder binder, Object[] args, Object& result)
   at CallSite.Target(Closure, CallSite, Object, Object)
   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
   at Program.<Main>$(String[] args) in C:\Users\Mohsen\RiderProjects\ConsoleApp2\ConsoleApp2\Program.cs:line 39

尽管进行了彻底的检查,代码在 Python 中仍能顺利运行,没有任何错误。

c# numpy fft python.net
1个回答
0
投票

NumPy 不知道 .NET 复杂类型。您需要使用 Python 复杂类型或让 NumPy 转换一维浮点数组。

© www.soinside.com 2019 - 2024. All rights reserved.