我正在使用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中运行顺利,没有任何错误.

推荐答案

NumPy不知道. NET Complex类型.你需要使用Python复杂类型,或者让NumPy转换一个1D浮点array.

Csharp相关问答推荐

Blazor:用参数创建根路径

如何使嵌套for-loop更高效?

如何创建ASP.NET Core主机并在同一进程中运行请求

应该使用哪一个?"_counter += 1 OR互锁增量(ref_counter)"""

什么是通过反射创建类的泛型接口方法的正确方法?

使用C#中的SDK在Microsoft Graph API上使用SubscribedSkus的问题

MS Graph v5.42.0:在寻呼消息时更改页面大小

在此系统上已禁用获取正在运行的脚本.&在ASP.NET Core Web API中

如何让NLog停止写入冗余信息?

C#中Java算法的类似功能

使用Entity Framework6在对象中填充列表会导致列表大多为空

在字符串C#之前获取数字

在ASP.NET Core 8 MVC中本地化共享视图

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

我找不到ASP.NET Web应用程序(.NET框架).已 Select .NET框架项目和项模板以及此组件(&Q;)

如何使用EPPlus C#在单个单元格中可视化显示多行文字

仅在ASP.NETCore应用程序中的附加单独端口上公开一组终结点

在使用.NET EF Core DbContext属性之前,是否应使用null判断

有没有更好的方法来使用LINQ获取整行的计算组

阻止CLR释放已封送的双字符指针的内存?