【问题标题】:Numpy broadcasting in z directionz方向的numpy广播
【发布时间】:2017-12-31 11:53:25
【问题描述】:

在机器学习环境中,我需要对每个元素进行乘法运算。为了有效地做到这一点,我需要以特定方式广播 3D 张量的元素,以便每个 2x2 矩阵重复 n 次,如下面的 n=2 示例所示:

import numpy as np

a = np.linspace(1,12,12)
a = a.reshape(3,2,2)

# what to put here?
<some statements>

print a

# result:
[[[  1.   2.]
  [  3.   4.]]

 [[  1.   2.]
  [  3.   4.]]

 [[  5.   6.]
  [  7.   8.]]

 [[  5.   6.]
  [  7.   8.]]

 [[  9.  10.]
  [ 11.  12.]]

 [[  9.  10.]
  [ 11.  12.]]]

什么语句可以完成这项工作?

谢谢!

【问题讨论】:

  • 太棒了,谢谢@Divakar!如果您想将其作为答案,我会将其标记为已解决。

标签: python numpy broadcasting


【解决方案1】:

这是一个 np.repeat 在将 a 作为 3D 数组后沿第一个轴复制 -

N = 2 # replication number
out = np.repeat(a,N,axis=0)

或者,对于4D 只读输出,我们可以使用np.broadcast_to 创建一个视图,这将非常有效,因为我们不会像这样占用任何额外的内存 -

m,n,r = a.shape
out = np.broadcast_to(a[:,None],(m,N,n,r))

# Confirm it's a view
In [32]: np.shares_memory(a, out)
Out[32]: True

【讨论】:

  • 也可以使用np.tile吗?我正在尝试这样np.tile(a, (2, 1, 1)),但重复不是连续的:(尽管生成的形状完美匹配
  • @kmario23 是的!几乎没有重塑 - np.tile(a.reshape(-1,4),2).reshape(-1,2,2)。重塑总是很方便:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多