मैं इस गणना में सभी अजगर छोरों को खत्म कर सकते हैं:मैं इस ट्रिपल-लूप को numpy में 2 डी सरणी से कैसे सदिश कर सकता हूं?
result[i,j,k] = (x[i] * y[j] * z[k]).sum()
जहां x[i]
, y[j]
, z[k]
लंबाई N
और x
, y
की वैक्टर हैं, z
लंबाई A
, B
के साथ पहली आयाम है, C
s.t. आउटपुट आकार (A,B,C)
है और प्रत्येक तत्व एक ट्रिपल-उत्पाद (तत्व-वार) का योग है।
मैं इसे 3 से 1 loops (नीचे कोड) से नीचे प्राप्त कर सकता हूं, लेकिन को अंतिम लूप को खत्म करने की कोशिश कर रहा हूं।
यदि आवश्यक हो तो मैं A=B=C
(पैडिंग की थोड़ी मात्रा के माध्यम से) बना सकता हूं।
np.einsum('im,jm,km->ijk',x,y,z)
जो आपके फंस संस्करणों के बराबर है:
# 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)
क्या यह होमवर्क है? – Dhara
अफसोस की बात है, यह होमवर्क समस्या नहीं है। असल में मैं रोमांचित होगा अगर "वेक्टरेट कैसे करें" के सामान्य विषय पर पाठ्यक्रम/पाठ्यपुस्तक थे! –