簡體   English   中英

如何從指針創建n-dim numpy數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM