簡體   English   中英

如何正確地將numpy數組傳遞給Cython函數?

[英]how to pass numpy array to Cython function correctly?

這在許多地方都有描述,但我根本無法讓它發揮作用。 我從Cython調用C ++函數:

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只是:

#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只有:

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

這似乎有效,但什么時候需要np.ascontiguousarray 這樣做是否足夠:

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

或者你需要:

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

第二,更重要的是,這如何推廣到二維陣列?

處理2d數組

這是我嘗試將2d numpy數組傳遞給C ++,但這不起作用:

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

被稱為:

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

在cpp代碼中:

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

更新:正確的答案

正確的答案是對數組使用線性索引而不是[][]語法。 打印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]);
    }
}

對於2D數組,您只需要ndim關鍵字:

cdef np.ndarray[double, mode="c", ndim=2]

結果可能會也可能不會與原始內容共享內存。 如果它與原始內存共享內存,則陣列可能不是連續的,或者可能具有不尋常的跨步配置。 在這種情況下,直接將緩沖區傳遞給C / C ++將是災難性的。

除非您的C / C ++代碼准備處理非連續數據,否則您應該始終使用ascontiguousarray (在這種情況下,您需要將所有相關的步幅數據從Cython傳遞到C函數中)。 如果輸入數組已連續,則不會進行任何復制。 確保兼容通過dtypeascontiguousarray ,這樣你就不會冒險的第二個副本(例如,具有從連續轉換float陣列上的連續double陣列)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM