numpy.vectorize
lấy hàm f: a-> b và biến nó thành g: a [] -> b [].Sử dụng Numpy Vectorize trên các hàm trả về các vectơ
Điều này hoạt động tốt khi a
và b
là vô hướng, nhưng tôi không thể nghĩ ra lý do tại sao nó không hoạt động với b dưới dạng ndarray
hoặc danh sách, tức là f: a-> b [] và g: a [] -> b [] []
Ví dụ:
import numpy as np
def f(x):
return x * np.array([1,1,1,1,1], dtype=np.float32)
g = np.vectorize(f, otypes=[np.ndarray])
a = np.arange(4)
print(g(a))
sản lượng này:
array([[ 0. 0. 0. 0. 0.],
[ 1. 1. 1. 1. 1.],
[ 2. 2. 2. 2. 2.],
[ 3. 3. 3. 3. 3.]], dtype=object)
Ok, do đó cung cấp cho các giá trị đúng, nhưng dtype sai. Và thậm chí tệ hơn:
g(a).shape
sản lượng:
(4,)
Vì vậy, mảng này là khá nhiều vô ích. Tôi biết tôi có thể chuyển đổi nó thực hiện:
np.array(map(list, a), dtype=np.float32)
để cho tôi những gì tôi muốn:
array([[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2.],
[ 3., 3., 3., 3., 3.]], dtype=float32)
nhưng điều đó không phải là hiệu quả cũng không pythonic. Có ai trong số các bạn tìm cách dọn dẹp được không?
Cảm ơn trước!
Thật vậy, "chỉ là một chức năng tiện lợi" mô tả hầu hết API numpy. Đó là toàn bộ vấn đề. Nó quá xấu chức năng này không hoạt động như một trong những mong đợi. –
Hầu hết các chức năng NumPy chỉ chậm hơn một chút so với hàm tương đương được viết bằng C. Điều này đúng khi hàm NumPy chỉ đơn thuần là một trình bao bọc mỏng xung quanh một hàm C (hoặc Fortran). Ngược lại, một hàm 'np.vectorized' vẫn phải gọi hàm * Python * một lần cho mỗi phần tử trong mảng, do đó nó thực hiện giống mã Python hơn mã C. Tra cứu tên động của Python cung cấp sự linh hoạt hơn, nhưng có thể chậm hơn nhiều so với mã C. – unutbu
không theo https://stackoverflow.com/questions/35215161/most-efficient-way-to-map-function-over-numpy-array –