|
86 | 86 | (pyforeign-funcall "PyArray_element_type_from_array"
|
87 | 87 | :pointer o :pointer)))))
|
88 | 88 | (from-vec (pyforeign-funcall "PyArray_Data" :pointer o :pointer))
|
89 |
| - ;; FIXME: Strides |
90 | 89 | (array (make-array dims :element-type element-type))
|
91 | 90 | (num-bytes (* (array-element-type-num-bytes array)
|
92 | 91 | (reduce #'* dims :initial-value 1))))
|
93 |
| - (if (type= t element-type) |
94 |
| - (let* ((numpy-array-data (pyforeign-funcall "PyArray_Data" |
95 |
| - :pointer o :pointer))) |
96 |
| - (loop :for idx :below (array-total-size array) |
97 |
| - :do (setf (row-major-aref array idx) |
98 |
| - (lispify |
99 |
| - (pyforeign-funcall "PyArray_GetItem" |
100 |
| - :pointer o |
101 |
| - :pointer (inc-pointer numpy-array-data |
102 |
| - (cl:* idx 8)) |
103 |
| - :pointer))))) |
| 92 | + (when (zerop (foreign-funcall "PyArray_Is_C_Contiguous" |
| 93 | + :pointer o :int)) |
| 94 | + (let ((new-pyarray |
| 95 | + (pyforeign-funcall |
| 96 | + "PY4CL_PyArray_FromArray" |
| 97 | + :pointer o |
| 98 | + :pointer (pyforeign-funcall |
| 99 | + "PyArray_Descr_from_element_type_code" |
| 100 | + :string (array-element-typecode array) |
| 101 | + :pointer) |
| 102 | + :int (mem-ref (foreign-symbol-pointer |
| 103 | + "PyArray_C_Contiguous") |
| 104 | + :int) |
| 105 | + :pointer))) |
| 106 | + (setq from-vec (pyforeign-funcall "PyArray_Data" |
| 107 | + :pointer new-pyarray |
| 108 | + :pointer)))) |
| 109 | + (if (type= element-type t) |
| 110 | + (loop :for idx :below (array-total-size array) |
| 111 | + :do (setf (row-major-aref array idx) |
| 112 | + (lispify |
| 113 | + (pyforeign-funcall "PyArray_GetItem" |
| 114 | + :pointer o |
| 115 | + :pointer (inc-pointer from-vec |
| 116 | + (cl:* idx 8)) |
| 117 | + :pointer)))) |
104 | 118 | (with-pointer-to-vector-data (to-vec (array-storage array))
|
105 |
| - (pyforeign-funcall "memcpy" :pointer to-vec :pointer from-vec :int num-bytes))) |
| 119 | + (pyforeign-funcall "memcpy" :pointer to-vec :pointer from-vec |
| 120 | + :int num-bytes))) |
106 | 121 | array))
|
107 | 122 |
|
108 | 123 | ;; TODO: Test these aka find reference in documentation for why this works
|
|
0 commit comments