2

この質問が不完全または理解しにくい場合は申し訳ありませんが、私は自分で理解しようとしています! 私はPython内に次の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;
      }

一方から他方にコピーされる 2 つの配列は次のとおりです。つまり、最初の配列が 2 番目の配列にコピーされ、既存の値が置き換えられます。

[[ 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]]
4

1 に答える 1

0

tmp->descr->type_numは整数を返します (たとえば、倍精度の結果は type_num=12 になります)。PyArray_INTしかし、PyArray_FLOAT、 、 などについてはわかりませんPyArray_CHAR。Google 検索から、これらは古い numeric_numarray.h ヘッダーで定義された型のように見えます。あなたがやりたいことは、ここにリストされているデータ型チェックを使用することだと思います。PyTypeNum_ISFLOAT(num)PyTypeNum_ISINTEGER(num)などを参照してください。

于 2013-10-08T00:53:50.573 に答える