我需要将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.tensordot
,np.dot
,np.matmul
和np.prod
,但是这些功能都不能完全做到这一点。
答案 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)