Tôi có thể loại bỏ tất cả các vòng Python trong tính toán này:Làm thế nào tôi có thể vector hóa vòng lặp ba vòng trên 2d mảng này trong không?
result[i,j,k] = (x[i] * y[j] * z[k]).sum()
nơi x[i]
, y[j]
, z[k]
là vectơ có độ dài N
và x
, y
, z
có kích thước đầu tiên với chiều dài A
, B
, C
s.t. đầu ra là hình dạng (A,B,C)
và mỗi phần tử là tổng của một sản phẩm ba (yếu tố khôn ngoan).
Tôi có thể gỡ xuống từ 3 đến 1 vòng (mã bên dưới), nhưng bị kẹt cố gắng để loại bỏ vòng lặp cuối cùng.
Nếu cần, tôi có thể thực hiện A=B=C
(qua số lượng nhỏ đệm).
# Example with 3 loops, 2 loops, 1 loop (testing omitted)
N = 100 # more like 100k in real problem
A = 2 # more like 20 in real problem
B = 3 # more like 20 in real problem
C = 4 # more like 20 in real problem
import numpy
x = numpy.random.rand(A, N)
y = numpy.random.rand(B, N)
z = numpy.random.rand(C, N)
# outputs of each variant
result_slow = numpy.empty((A,B,C))
result_vec_C = numpy.empty((A,B,C))
result_vec_CB = numpy.empty((A,B,C))
# 3 nested loops
for i in range(A):
for j in range(B):
for k in range(C):
result_slow[i,j,k] = (x[i] * y[j] * z[k]).sum()
# vectorize loop over C (2 nested loops)
for i in range(A):
for j in range(B):
result_vec_C[i,j,:] = (x[i] * y[j] * z).sum(axis=1)
# vectorize one C and B (one loop)
for i in range(A):
result_vec_CB[i,:,:] = numpy.dot(x[i] * y, z.transpose())
numpy.testing.assert_almost_equal(result_slow, result_vec_C)
numpy.testing.assert_almost_equal(result_slow, result_vec_CB)
Đây có phải là bài tập về nhà không? – Dhara
Đáng buồn thay, nó không phải là một bài tập về nhà. Trên thực tế tôi muốn được vui mừng nếu có các khóa học/sách giáo khoa về chủ đề chung của "Làm thế nào để tôi vectorize"! –