2013-10-06 103 views
2

如果這個問題不完整或難以理解,我很抱歉,我試圖弄清楚自己! 我有以下的C代碼,在python裏面 - 我不擅長這兩種語言。python中的C代碼和C代碼中的數組複製

下面的C代碼複製numpy數組我認爲。它在我使用它時不工作,它使用SWITCH語句並打印「默認」答案。有人可以幫助嗎?

它是python的版本嗎?它似乎在老版本的python中工作。

static PyObject *llpy_acopy(PyObject *unused, PyObject *args) 
    { 
    PyObject *afrom = PyTuple_GET_ITEM(args, 0); 
    PyObject *ato = PyTuple_GET_ITEM(args, 1); 
    PyArrayObject *tmp = (PyArrayObject *)afrom; 
    int nd = tmp->nd; 
    int n = 1; 
    int i; 
    for (i=0; i<nd; i++) 
    n *= tmp->dimensions[i]; 

    switch(tmp->descr->type_num) { 
    case PyArray_FLOAT: 
     memcpy(((PyArrayObject *)ato)->data, tmp->data, 
       (size_t)(n * sizeof(float))); 
     break; 
    case PyArray_INT: 
     memcpy(IDATA(ato), IDATA(afrom), 
      (size_t)(n * sizeof(int))); 
     break; 
    case PyArray_CHAR: 
     memcpy(CDATA(ato), CDATA(afrom), 
      (size_t)(n * sizeof(char))); 
     break; 
    default: 
     PyErr_SetString(PyExc_TypeError, "Cannot copy array now"); 
     return NULL; 
    } 
    Py_INCREF(Py_None); 
    return Py_None; 
     } 

的兩個陣列從一個到另一個被複制是 - 即第一陣列被複制到所述第二,替換現有值。

[[ 1.   0.   0.  ] 
[ 1.51999998 1.42799997 0.  ] 
[ 0.73699999 2.37800002 0.  ] 
    ..., 
[-7.55183792 -9.31523228 -0.19252452] 
[-6.7193203 -8.40346909 0.58392692] 
[-8.47850037 -9.02481842 -0.46105781]] 


[[ 1.   0.   0.  ] 
[ 1.51999998 1.42799997 0.  ] 
[ 0.73699999 2.37800002 0.  ] 
    ..., 
[-5.86299992 -9.36299992 -5.0999999 ] 
[-5.61800003 -7.94799995 -4.84499979] 
[-6.12400007 -9.65600014 -6.02799988]] 
+0

您是否嘗試過調試,以便知道「tmp-> descr-> type_num」返回的值? – dckuehn

+1

這整個事情沒有多大意義,並簡化了一般numpy數組。你應該使用像'PyArray_CopyInto'這樣的功能可用的內置numpy C-api。 – seberg

+2

至於它爲什麼會進入錯誤路徑。我最好的猜測是你可能會遇到不同的整數類型或雙精度數字? – seberg

回答

0

表達式tmp->descr->type_num將返回一個整數(例如,雙精度結果type_num = 12)。但我不知道關於PyArray_INT,PyArray_FLOAT,PyArray_CHAR等。從谷歌搜索,這些看起來像在舊的numeric_numarray.h頭定義的類型。我認爲你想要做的是使用data-type checking listed here。請參閱PyTypeNum_ISFLOAT(num),PyTypeNum_ISINTEGER(num)等。

+1

你是對的Joel,非常感謝你。問題在於我給出的包是由很多人在很長一段時間內建立的,他們有MIXED numpy和Numeric定義。我從使用數字數組類型切換到Numpy數組,這個問題似乎已經排除了。你可以在http://stackoverflow.com/questions/19236121/equivalent-of-using-include-numeric-arrayobject-h-in-numpy/19236834#19236834看到更多 –