Tôi đã viết một số mã trong Python hoạt động tốt nhưng rất chậm; Tôi nghĩ là do các vòng lặp. Tôi hy vọng người ta có thể tăng tốc các hoạt động sau bằng cách sử dụng các lệnh numpy. Hãy để tôi xác định mục tiêu.vectơ numpy thay vì cho vòng
Giả sử tôi có một mảng có khối lượng 2D all_CMs
của thứ nguyên row
x col
. Ví dụ, xem xét một mảng 6
x 11
(xem hình bên dưới).
tôi muốn để tính toán giá trị trung bình cho tất cả các hàng, ví dụ: tổng ⱼ aᵢⱼ kết quả trong một mảng. Điều này, tất nhiên có thể dễ dàng thực hiện. (Tôi gọi là giá trị này
CM_tilde
)Bây giờ, cho mỗi hàng tôi muốn để tính toán giá trị trung bình của một số giá trị được chọn, cụ thể là tất cả các giá trị dưới một ngưỡng nhất định bằng cách tính toán số tiền của họ và chia cho số lượng tất cả các cột (
N
). Nếu giá trị cao hơn ngưỡng được xác định này, giá trịCM_tilde
(giá trị trung bình của toàn bộ hàng) được thêm vào. Giá trị này được gọi làCM
Sau đó, giá trị
CM
được trừ từ mỗi phần tử trong hàng
Thêm vào đó tôi muốn có một mảng NumPy hoặc danh sách mà tất cả những giá trị CM
được liệt kê .
Hình:
Các mã sau đây được làm việc nhưng rất chậm (đặc biệt nếu các mảng việc lớn)
CM_tilde = np.mean(data, axis=1)
N = data.shape[1]
data_cm = np.zeros((data.shape[0], data.shape[1], data.shape[2]))
all_CMs = np.zeros((data.shape[0], data.shape[2]))
for frame in range(data.shape[2]):
for row in range(data.shape[0]):
CM=0
for col in range(data.shape[1]):
if data[row, col, frame] < (CM_tilde[row, frame]+threshold):
CM += data[row, col, frame]
else:
CM += CM_tilde[row, frame]
CM = CM/N
all_CMs[row, frame] = CM
# calculate CM corrected value
for col in range(data.shape[1]):
data_cm[row, col, frame] = data[row, col, frame] - CM
print "frame: ", frame
return data_cm, all_CMs
Bất kỳ ý tưởng?
Trong bước 2, về cơ bản bạn có thay thế bất kỳ giá trị nào vượt quá ngưỡng trên CM_tilde không và sau đó * tính giá trị trung bình trên toàn bộ hàng, bao gồm cả giá trị được thay thế? – Evert
Bắt đầu bằng cách sử dụng 'np.where' để thay thế vòng lặp bên trong của bạn. Sau đó, bằng cách sử dụng phát sóng, bạn có thể xóa 2 vòng lặp bên ngoài. Xem tài liệu cho [where] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.where.html) – mtadd