将3D numpy数组乘以2D numpy数组

时间:2020-03-10 13:55:16

标签: python numpy vectorization array-broadcasting

我需要将3D numpy数组乘以2D numpy数组。

假设3D数组A的形状为[Tue Mar 10 21:31:14.492568 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] mod_wsgi (pid=31057): Target WSGI script '/var/www/sales_track/app.wsgi' cannot be loaded as Python module. [Tue Mar 10 21:31:14.492631 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] mod_wsgi (pid=31057): Exception occurred processing WSGI script '/var/www/sales_track/app.wsgi'. [Tue Mar 10 21:31:14.493027 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] Traceback (most recent call last): [Tue Mar 10 21:31:14.493071 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] File "/var/www/sales_track/app.wsgi", line 6, in <module> [Tue Mar 10 21:31:14.493080 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] from app import create_app, db as application [Tue Mar 10 21:31:14.493093 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] File "/var/www/sales_track/app/__init__.py", line 2, in <module> [Tue Mar 10 21:31:14.493099 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] from flask_sqlalchemy import SQLAlchemy [Tue Mar 10 21:31:14.493123 2020] [wsgi:error] [pid 31057:tid 140353852122880] [client 120.29.85.139:8222] ModuleNotFoundError: No module named 'flask_sqlalchemy' ,而2D数组B的形状为(3, 100, 500)。我需要对3D数组中的这500个轴中的每一个轴进行2维数组的元素逐次乘法,然后我需要沿着结果数组的第一个轴求和以生成大小为(3, 100)的数组。

我可以通过几个for循环到达那里,但是肯定有一个numpy函数可以在1行中实现这一点吗?我看过(100, 500)np.tensordotnp.dotnp.matmulnp.prod,但是这些功能都不能完全做到这一点。

4 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用np.einsum轻松地表达这些操作:

np.einsum("ijk,ij->jk", A, B)

答案 1 :(得分:0)

我们可以利用Numpy广播:

import numpy as np

a = np.random.rand(3,100,500)
b = np.random.rand(3,100)

# add new axis to b to use numpy broadcasting
b = b[:,:,np.newaxis]
#b.shape = (3,100,1)

# elementwise multiplication
m = a*b
# m.shape = (3,100,500)

# sum over 1st axis
s = np.sum(m, axis=0)

#s.shape = (100,500)

答案 2 :(得分:0)

您可以通过向2D阵列添加新的单位轴进行广播:

np.sum(A * B[..., None], axis=0)
索引中的

None在该位置引入了单位尺寸,可用于对齐广播轴。 ...:的简写,它是尺寸的倍数:在这种情况下,它等效于:, :,因为B是2D。

另一种写法是

(A * B.reshape(*B.shape, 1)).sum(axis=0)

答案 3 :(得分:0)

您可以尝试以下可行的方法,

np.sum(A.T*B.T,axis=-1).T

这将使您的身材(100,500)