2015-09-16 94 views
-1

我使用​​用C語言編寫的一個DLL接口和我創造了這樣的數組:如何添加/減去c_double_Array?

foo = (c_double * 1000)() 
bar = (c_double * 1000)() 

我可以得到所有的值與foo[:]和類型是:

type(foo) 
c_double_array_1000 

然而我不能用吧減去foo:

unsupported operand type(s) for -: 'c_double_Array_1000' and 'c_double_Array_1000' 

我錯過了什麼?

+0

數組不支持減法..你想要做什麼? –

+0

您不能減去數組,但可以減去數組中的值。 – NendoTaka

+0

我想減少價值明智的我的數組。例如:'[1,2,3] - [0,1,2]'='[1,1,1]'。 – nowox

回答

0

至於你提到nowox,避免循環的一個方法是使用numpy。如果你不想處理模塊,NendoTaka確實然而

array([ 4, -2, 2, -4, 0, -6, -2, -8, -4, 0]) 

試試這個:

import ctypes 
import numpy as np 
a = (ctypes.c_int * 10)(1,2,3,4,5,6,7,8,9,0) 
b = (ctypes.c_int * 10)(5,0,5,0,5,0,5,0,5,0) 

x = np.array(a) 
y = np.array(b) 

x - y 

的意志給你。你將需要使用循環和Prune答案是正確的。

+1

要避免使用'x = np.frombuffer(a); y = np.frombuffer(b)'。然後返回一個ctypes數組而不復制,你可以使用'result = type(a).from_buffer(x-y)'。 – eryksun

+1

如果您對細節感興趣,Python的緩衝協議會在'np.frombuffer'調用中傳達正確的數據類型和大小。實際擁有內存的ctypes數組被引用爲'x.base'和'y.base','x.flags.owndata == False',因爲它不擁有數據。對於ctypes'from_buffer'調用,擁有結果數組內存的'x-y' NumPy數組在'result._objects'字典中被引用。同樣'result._b_needsfree_ == 0'因爲ctypes對象不擁有內存。 – eryksun

0
import ctypes 
foo = (ctypes.c_double * 3)(14, 22, 37) 
bar = (ctypes.c_double * 3)(0, 1, 2) 
diff = [foo[i]-bar[i] for i in range(len(foo))] 
print diff 
+0

人們可能希望'diff'是相同的數組類型而不是列表,例如'diff = type(foo)(*(f - b for f,b in zip(foo,bar)));''print(* diff,sep =',')'。 (對於Python 2,這需要'from __future__ import print_function'和效率'from future_builtins import zip'。) – eryksun