numpy API를 사용하여 일반화 된 ufunc를 만들려고합니다. 입력은 하나의 (n x m)
행렬 및 스칼라이고 출력은 두 행렬 ((n x p)
및 (p x m)
)입니다. 그러나 나는 그것을하는 방법을 모른다. 누군가 나를 도울 수 있니? I는 입력 (행렬 및 스칼라)를 읽을 수일반화 된 범용 함수 (numpy)
"(n,m),()->(n,p),(p,m)"
하지만 서명의 치수 (P)와 같은 스칼라 입력을 사용하고자 : 초기화 기능에 난 서명 PyUFunc_FromFuncAndDataAndSignature
함수를 사용하고 있습니다. 가능한가? 여기
바로 입력 인쇄 예제 코드 :
#include "Python.h"
#include "math.h"
#include "numpy/ndarraytypes.h"
#include "numpy/ufuncobject.h"
static PyMethodDef nmfMethods[] = {
{NULL, NULL, 0, NULL}
};
static void double_nmf(char **args, npy_intp *dimensions,
npy_intp* steps, void* data)
{
npy_intp i, j,
n = dimensions[1], //dimensions of input matrix
m = dimensions[2]; //
printf("scalar: %d\n",*(int*)args[1]); // input scalar
// just print input matrix
printf("Input matrix:\n");
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%.1f ",*(double*)(args[0]+8*(i*m+j)));
}
printf("\n");
}
return;
}
static PyUFuncGenericFunction nmf_functions[] = { double_nmf };
static void * nmf_data[] = { (void *)NULL };
static char nmf_signatures[] = { PyArray_DOUBLE, PyArray_INT, PyArray_DOUBLE, PyArray_DOUBLE };
char *nmf_signature = "(n,m),()->(n,p),(p,m)";
PyMODINIT_FUNC initnmf(void)
{
PyObject *m, *d, *version, *nmf;
m = Py_InitModule("nmf", nmfMethods);
if (m == NULL) {
return;
}
import_array();
import_umath();
d = PyModule_GetDict(m);
version = PyString_FromString("0.1");
PyDict_SetItemString(d, "__version__", version);
Py_DECREF(version);
nmf = PyUFunc_FromFuncAndDataAndSignature(nmf_functions, nmf_data, nmf_signatures, 1,
2, 2, PyUFunc_None, "nmf",
"", 0, nmf_signature);
PyDict_SetItemString(d, "nmf", nmf);
Py_DECREF(nmf);
}
이 코드는 컴파일 및 작동합니다.
#/usr/bin/python
import numpy as np
import nmf
x = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]])
y,z = nmf.nmf(x,2)
print "Shapes of outputs: ", y.shape, z.shape
와 단자 출력된다 : Python 스크립트는 여기
scalar: 2
Input matrix:
1.0 2.0 3.0 4.0 5.0
6.0 7.0 8.0 9.0 10.0
11.0 12.0 13.0 14.0 15.0
16.0 17.0 18.0 19.0 20.0
Shapes of outputs: (4, 1) (1, 5)
내 의심 출력 매트릭스의 치수 (P)과 같은 (경우 2) 스칼라 입력을 사용하는 방법이다. 예를 들어 p = 1이고 설정하지 않았습니다.
원본 배열, 스칼라 및 최종 배열의 최소 예를 보여주십시오. – wwii
아쉽게도 불가능합니다.따라서 gufuncs의 서명 구문 분석기가 작동하면 출력 배열은 항상'p == 1'을 갖게됩니다. 다른 값을 원하면, 출력 배열을 미리 할당하고 gufunc의'out' 키워드 인수를 사용하여 전달하십시오. NumPy 1.10은 사용자가하려는 일을 가능하게하는 추가 기능을 제공 할 것입니다. – Jaime
'p '가 스칼라 입력의 * value *에 의해 결정되기를 원한다는 말입니까? 그렇다면 gufunc는 원하는 것이 아닙니다. 그냥 규칙적인 함수를 만듭니다. gufunc의 개념은 인수를 통해 방송 할 수 있지만, 두 개의 서로 다른 스칼라를 전달하고자한다고 가정합니다. 출력 모양은 (2, n, 3)이 될 수 없습니다 (2,3 , m) 및 (2, n, 4), (2,4, m)을 동시에 출력한다. (2는 입력 벡터를 통한 브로드 캐스팅에서 나온 것입니다.) –