python - 有效地将 System.Single[,] 转换为 numpy 数组

标签 python .net numpy python.net

使用 Python 3.6 和用于 dotNET/pythonnet 的 Python 我设法获得了一个图像数组。这是 System.Single[,] 类型

我想将它转换成一个 numpy 数组,这样我就可以在 Python 中用它做一些事情。我已经设置了一个函数来遍历该数组并将其按元素转换 - 但是我可以使用更明智(更快)的东西吗?

def MeasurementArrayToNumpy(TwoDArray):
    hBound = TwoDArray.GetUpperBound(0)
    vBound = TwoDArray.GetUpperBound(1)

    resultArray = np.zeros([hBound, vBound])

    for c in range(TwoDArray.GetUpperBound(0)):            
            for r in range(TwoDArray.GetUpperBound(1)):
                resultArray[c,r] = TwoDArray[c,r]
    return resultArray

最佳答案

@denfromufa - 这是一个非常有用的链接。

建议使用 Marshal.Copy 或 np.frombuffer 进行直接内存复制。我无法让 Marshal.Copy 版本正常工作 - 需要一些恶作剧才能将二维数组与 Marshal 一起使用,并且以某种方式改变了数组的内容 - 但 np.frombuffer 版本似乎对我有用并减少了对于 3296*2471 阵列(~25s -> ~1.50ms),完成时间约为 16000 倍。这对我来说已经足够了

该方法需要更多的导入,所以我将它们包含在下面的代码片段中

import ctypes
from System.Runtime.InteropServices import GCHandle, GCHandleType

def SingleToNumpyFromBuffer(TwoDArray):
    src_hndl = GCHandle.Alloc(TwoDArray, GCHandleType.Pinned)

    try:
        src_ptr = src_hndl.AddrOfPinnedObject().ToInt32()
        bufType = ctypes.c_float*len(TwoDArray)
        cbuf = bufType.from_address(src_ptr)
        resultArray = np.frombuffer(cbuf, dtype=cbuf._type_)
    finally:
        if src_hndl.IsAllocated: src_hndl.Free()
    return resultArray

关于python - 有效地将 System.Single[,] 转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43910749/

相关文章:

python - Numpy字符串数组,赋值

python - 无法使用 python 从列表元素中删除双引号

python - redis-py "ConnectionError: Socket closed on remote end"

python-3.x - 在 Python/Numpy 中从字符串构造高级切片

c# - 用于修复 .NET 应用程序以解决 SQL Server 超时问题并改进执行时间的 list

c# - 我应该使用 '==' 进行 .NET 本地化字符串比较吗?

python - numpy,h5py : How do I make an array sorted by one of its columns from a bigger one saved with h5py?

python - Keras 的训练数据权重

python - 获取属性定义中的类名

c# - .Net 并行、任务 API 与常规线程