como passar numpy array para a função Cython corretamente?

Isso é descrito em muitos lugares, mas eu simplesmente não consigo fazê-lo funcionar. Estou chamando uma função C ++ do Cython:

cimport numpy as np
cdef extern from "test.h" namespace "mytest":
   void test(double *A, int m)

cdef int foo():
  cdef np.ndarray[double,mode="c"] a = np.array([1,2,3,4,5],dtype=float)
  # pass ptr to first element of 'a'
  test(&a[0], len(a))
  return 0

foo()

test.cpp é apenas:

#include <stdio.h>
namespace mytest {
    void test(double *A, int m)
    {
    for (int i = 0; i < m; i++)
    {
        printf("%d is %f\n", i, A[i]);
    }
    }
}

test.h apenas possui:

namespace mytest {
  void test(double *A, int m);
}

Isso parece funcionar, mas quando énp.ascontiguousarray necessário? É suficiente fazer:

cdef np.ndarray[double,mode="c"] a = np.array([1,2,3,4,5],dtype=float)

ou você precisa de:

cdef np.ndarray[double,mode="c"] a = np.ascontiguousarray(np.array([1,2,3,4,5],dtype=float))

segundo e mais importante, como isso pode generalizar para matrizes 2D?

Manipulando matrizes 2d

Aqui está minha tentativa de passar matrizes numpy 2D para C ++, que não funciona:

cdef np.ndarray[double,mode="c",ndim=2] a = np.array([[1,2],[3,4]],dtype=float)

que é chamado como:

test(&a[0,0], a.shape[0], a.shape[1])

no código cpp:

void test(double *A, int m, int n) 
{ 
  printf("reference 0,0 element\n");
  printf("%f\n", A[0][0]);
}

UPDATE: A resposta correta

A resposta correta é usar a indexação linear para a matriz e não o[][] sintaxe. A maneira correta de imprimir a matriz 2D é:

for (int i = 0; i < m; i++)
{
    for (int j = 0; j < n; j++)
    {
    printf("%d, %d is %f\n", i, j, A[i*m + j]);
    }
}

questionAnswers(1)

yourAnswerToTheQuestion