Comment faire pour convertir un pointeur en un tableau de python
J'ai en C++ une fonction de rappel qui remet en Python à l'aide de ctypes. Cette fonction, les paramètres sont un pointeur vers un tableau de double et le nombre d'éléments.
Il y a beaucoup d'éléments, d'environ 2 000 000 d'. J'ai besoin de l'envoyer dans scipy fonctions.
Le prototype C++ est :
bool (*ptsetDataSource)(double*, long long);
qui est le code python suivant:
CPF_setDataSource = CFUNCTYPE(c_bool, POINTER(c_double),c_longlong)
CPF_setSelection= CFUNCTYPE(c_bool,c_char_p, c_longlong,c_longlong)
CPF_ResetSequence = CFUNCTYPE(c_bool)
def setDataSource(Data, DataLength):
Datalist=[0.0]*100
for i in range(0,100):
Datalist[i]=Data[i]
print Datalist
return True
Le problème est que l'impression datalist retourne:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
qui n'est pas correct(les données sont remplis avec beaucoup d'autres numéros lorsque cette option est cochée sur le c++ côté.
Aussi, si j'utilise ce code pour convertir les données d'une liste python, il verrouille l'ordinateur à l'allocation de l'étape.
Est-il de toute façon pour charger les données à partir du C++ tableau puis de le convertir en un tableau ajustement pour scipy?
source d'informationauteur ochensati
Vous devez vous connecter pour publier un commentaire.
Si
Data
ont été(c_double*DataLength.value)
tableau alors vous pourriez:Si
Data
est unPOINTER(c_double)
vous pourriez obtenir un tableau numpy à l'aide denumpy.fromiter()
. C'est la même boucle que dans votre question, mais plus rapide:Pour créer un tableau numpy de
POINTER(c_double)
instance sans copier vous pouvez utiliser.from_address()
méthode:Ou
Les deux méthodes convertir
POINTER(c_double)
instance de(c_double*DataLength)
avant de passer ànumpy.frombuffer()
.Cython solution à base
Ici C module d'extension pour Python (écrit en Cython) qui fournissent de l'API C de la fonction de conversion:
Il pourrait être utilisé avec
ctypes
comme suit:Où
call_callback
est:void call_callback(bool (*)(double *, long long))
.