Tôi có hàm C để bình thường hóa các hàng của mảng trong không gian nhật ký (điều này ngăn chặn tràn số).Cách tính toán mảng tiếp giáp với cột khi mở rộng numpy bằng C
Nguyên mẫu của C-chức năng của tôi là như sau:
void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
Bạn có thể thấy rằng phải mất một con trỏ đến một mảng và sửa đổi nó tại chỗ. C-code của khóa học giả định dữ liệu được lưu dưới dạng một mảng C tiếp giáp, tức là hàng tiếp giáp.
tôi quấn chức năng như sau sử dụng Cython (nhập khẩu và cdef extern from
bỏ qua):
def normalize_logspace(np.ndarray[np.double_t, ndim=2] mat):
cdef Py_ssize_t n, d
n = mat.shape[0]
d = mat.shape[1]
normalize_logspace_matrix(n, d, <double*> mat.data)
return mat
Phần lớn thời gian NumPy-mảng là hàng tiếp giáp và chức năng hoạt động tốt. Tuy nhiên, nếu một mảng numpy trước đây đã được transposed dữ liệu không được sao chép xung quanh nhưng chỉ là một cái nhìn mới vào dữ liệu được trả về. Trong trường hợp này, hàm của tôi không thành công vì mảng không còn tiếp giáp với hàng.
tôi có thể làm được việc này bằng cách định nghĩa mảng có thứ tự Fortran tiếp giáp, như vậy sau khi transposing nó sẽ là C tiếp giáp:
A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
Rõ ràng đó là rất dễ bị lỗi và người dùng phải mất quan tâm rằng mảng là đúng thứ tự mà là một cái gì đó mà người dùng không cần phải quan tâm trong Python.
Cách tốt nhất để tôi có thể thực hiện công việc này với cả mảng tiếp giáp hàng và cột là gì? Tôi cho rằng một số loại kiểm tra thứ tự mảng trong Cython là con đường để đi. Tất nhiên, tôi thích một giải pháp mà không cần phải sao chép dữ liệu vào một mảng mới, nhưng tôi gần như giả định đó là cần thiết.
Câu trả lời này có từ năm 2010 vẫn là hiện tại hay có cách nào tốt hơn để đạt được điều này ngay bây giờ không? –
@larsmans: Tôi không biết chính xác những gì bạn muốn nói "này".Viết một hàm C có thể xử lý cả hai mảng hai chiều liền kề và C tiếp giáp của Fortran vẫn hoạt động theo cách này, nếu đây là những gì bạn muốn. Nếu nó là ok rằng mảng của bạn được sao chép, có (và đã được trong năm 2010) các giải pháp khác. –