Passing 3-dimensional numpy array to C

前端 未结 4 1002
旧巷少年郎
旧巷少年郎 2021-02-01 09:43

I\'m writing a C extension to my Python program for speed purposes, and running into some very strange behaviour trying to pass in a 3-dimensional numpy array. It works with a 2

4条回答
  •  伪装坚强ぢ
    2021-02-01 10:23

    I already mentioned this in a comment, but I hope flushing it out a little helps make it more clear.

    When you're working with numpy arrays in C it's good to be explicit about the typing of your arrays. Specifically it looks like you're declaring your pointers as double ***list3, but they way you're creating l3 in your python code you'll get an array with dtype npy_intp (I think). You can fix this by explicitly using the dtype when creating your arrays.

    import cmod, numpy
    l2 = numpy.array([[1.0,2.0,3.0],
                      [4.0,5.0,6.0],
                      [7.0,8.0,9.0],
                      [3.0, 5.0, 0.0]], dtype="double")
    
    l3 = numpy.array([[[2,7, 1, 11], [6, 3, 9, 12]],
                      [[1, 10, 13, 15], [4, 2, 6, 2]]], dtype="double")
    
    cmod.func(l2, l3)
    

    Another note, because of the way python works it's nearly impossible for "line A" and "line B" to have any effect on the C code what so ever. I know that this seems to conflict with your empirical experience, but I'm pretty sure on this point.

    I'm a little less sure about this, but based on my experience with C, bus-errors and segfaults are not deterministic. They depend on memory allocation, alignment, and addresses. In some situation code seems to run fine 10 times, and fails on the 11th run even though nothing has changed.

    Have you considered using cython? I know it's not an option for everyone, but if it is an option you could get nearly C level speedups using typed memoryviews.

提交回复
热议问题