使用 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/