[英]How to create n-dim numpy array from a pointer?
我讀過關於numpy.frombuffer的內容,但找不到任何從指針創建數組的方法。
正如上面的評論所指出的,你可以使用numpy.ctypeslib.as_array
:
numpy.ctypeslib.as_array(obj,shape = None)
從ctypes數組或ctypes POINTER創建一個numpy數組。 numpy數組與ctypes對象共享內存。
如果從ctypes POINTER轉換,則必須給出size參數。 如果從ctypes數組轉換,則忽略size參數
所以讓我們模仿一個C函數返回一個調用malloc
的指針:
import ctypes as C
from ctypes.util import find_library
import numpy as np
SIZE = 10
libc = C.CDLL(find_library('c'))
libc.malloc.restype = C.c_void_p
# get a pointer to a block of data from malloc
data_pointer = libc.malloc(SIZE * C.sizeof(C.c_int))
data_pointer = C.cast(data_pointer,C.POINTER(C.c_int))
您現在可以將此指針指向的數據設置為numpy
new_array = np.ctypeslib.as_array(data_pointer,shape=(SIZE,))
並證明他們正在訪問相同的內存:
new_array[:] = range(SIZE)
print "Numpy array:",new_array[:SIZE]
print "Data pointer: ",data_pointer[:SIZE]
應該輸出:
Numpy array: [0 1 2 3 4 5 6 7 8 9]
Data pointer: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
最后要注意,numpy數組不擁有其內存,因此需要顯式調用free來避免內存泄漏。
del new_array
libc.free(data_pointer)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.