2017-07-13 8 views
0

私はPythonでCライブラリをラップし、対応するDLLを呼び出しました。次に、すべてのデータポイントを出力するfor-loopを作成しました。ここ は私のコードと私は包まれているライブラリの小さなサンプルです:forループの値がnumpyの配列

import ctypes 
from ctypes import * 

class ParmData(Union): 
_fields_ = [ 
     ('c', ctypes.POINTER(ctypes.c_ubyte)), 
     ('f', ctypes.POINTER(ctypes.c_float))] 
class SParm(Structure): 
pass 
SParm._fields_ = [ 
     ('data', ctypes.POINTER(ParmData)), 
     ('time', ctypes.POINTER(ctypes.c_float))] 

dll.readSParm.argtypes = (POINTER(SFile), c_char_p, c_double, c_double, c_double, POINTER(TTag), c_ushort,) 
dll.readSParm.restype = POINTER(SParm) 
g = dll.readSParm(SF, ParmName, startTime, stopTime, Null, None, convertType) 
dll.freeSParm(g) 

これは、forループ、私はPythonで作成されています:

for i in range(0, 50000): 
print(i, (g[0].data[0].f[i]), (g[0].time[i])) 

(g[0].data[0].f) 
(g[0].time) 

は、すべてのデータを含むオブジェクトへのポインタです。

このようなforループの外観の結果は、2列目のデータであり、第3は、そのデータに対して対応する時間値である:

2 -4864024.0 -1027.21630859375 
3 5.114739e-43 -1026.21630859375 
4 2.840103e-37 -1025.21630859375 
5 2.250064e-38 -1024.21630859375 

私の質問はこれです:

どのようにすることができますこのデータを低次元の配列にしますか?私は非常に多くのデータポイントを持っているので、私は、それらのすべてを入力しカント

答えて

0

汚れを(まだ簡単に)あなたがそうのように、行くような方法は、単にデータを反復処理し、配列を埋めるために、次のようになります。

data_len = 5000 #<- you should have a way of knowing how much data there is 
arr = np.empty([data_len,2],dtype=np.float) #empty array of the right size 
for i in range(data_len): #we fill the array row by row 
    arr[i,:]= (g[0].data[0].f[i],g[0].time[i]) 

print(arr) 
+0

これはうまくいく、ありがとう。なぜあなたはそれが汚いと思っているのだろうか? –

関連する問題