【发布时间】:2023-03-26 17:52:02
【问题描述】:
我有两个带形状的 ndarray:
A = (32,512,640)
B = (4,512)
我需要将 A 和 B 相乘以得到一个新的 ndarray:
C = (4,32,512,640)
另一种思考方式是向量 B 的每一行沿 A 的轴 =-2 相乘,得到一个新的 1,32,512,640 立方体。 B 的每一行可以循环形成 1,32,512,640 个立方体,然后可以使用 np.concatenate 或 np.vstack 来构建 C,例如:
# Sample inputs, where the dimensions aren't necessarily known
a = np.arange(32*512*465, dtype='f4').reshape((32,512,465))
b = np.ones((4,512), dtype='f4')
# Using a loop
d = []
for row in b:
d.append(np.expand_dims(row[None,:,None]*a, axis=0))
# Or using list comprehension
d = [np.expand_dims(row[None,:,None]*a,axis=0) for row in b]
# Stacking the final list
result = np.vstack(d)
但我想知道是否可以使用np.einsum 或np.tensordot 之类的东西在一行中将此矢量化。我还在学习如何使用这两种方法,所以我不确定这里是否合适。
谢谢!
【问题讨论】:
-
你已经尝试了什么?它在工作吗?如果不是,它以何种方式未能按预期执行?
-
添加了我已经尝试过的内容,尽管在下面发布了有用的答案之后。它按预期执行,但我怀疑可能有更好或更有效的方法来做到这一点(通过性能或更少的代码行)。
-
@wolfblade87 btw、
A、B和C不是向量;它们分别是 3D、2D 和 4D 数组。
标签: python numpy vectorization numpy-einsum tensordot