Панды данных умножают на серию [дубликаты]

Кажется, вы делаете матричные умножения для каждого среза вдоль первой оси. Для этого вы можете использовать np.einsum так же -

np.einsum('ijk,ikl->ijl',A,B)

Мы также можем использовать np.matmul -

np.matmul(A,B)

В Python 3.x эта операция matmul упрощается с помощью оператора @ -

A @ B

Бенчмаркинг

Подходы -

def einsum_based(A,B):
    return np.einsum('ijk,ikl->ijl',A,B)

def matmul_based(A,B):
    return np.matmul(A,B)

def forloop(A,B):
    N = A.shape[0]
    C = np.zeros((N,2,2))
    for i in range(N):
        C[i] = np.dot(A[i], B[i])
    return C

Сроки -

In [44]: N = 10000
    ...: A = np.random.rand(N,2,2)
    ...: B = np.random.rand(N,2,2)

In [45]: %timeit einsum_based(A,B)
    ...: %timeit matmul_based(A,B)
    ...: %timeit forloop(A,B)
100 loops, best of 3: 3.08 ms per loop
100 loops, best of 3: 3.04 ms per loop
100 loops, best of 3: 10.9 ms per loop

30
задан tmthydvnprt 29 March 2016 в 14:19
поделиться