【问题标题】:numpy, different slices for different layers of arraynumpy,不同层的数组的不同切片
【发布时间】:2017-01-17 13:37:12
【问题描述】:

我有一个 3d 数组 m*n*k,并且对于每个 2d 层,我想要一个大小为 i*j 的子数组。我有一个数组 c,其大小为 2*k,每一层的切片起点坐标。有没有简单的方法来获得我需要的东西而无需任何循环?

例子:

test = np.arange(18).reshape((3,3,2))
c = np.array([[0,1], [0, 1]])

test[:,:,0] = array([[ 0,  2,  4],
                     [ 6,  8, 10],
                     [12, 14, 16]])

test[:,:,1] = array([[ 1,  3,  5],
                     [ 7,  9, 11],
                     [13, 15, 17]])

我想要一个数组

  [[[ 0,  9],
    [ 2,  11]],

   [[ 6,  15],
    [ 8,  17]]]

带循环的解决方案:

h=2
w=2
layers = 2
F = np.zeros((h,w,layers))
for k in range(layers):
    F[:,:,k] = test[c[0,k]:c[0,k]+h, c[1,k]:c[1,k]+w, k]

【问题讨论】:

  • 您能否分享一下您将如何使用循环来实现它,因为从给定的输入中获取预期的 o/p 尚不清楚?
  • 添加了循环解决方案
  • 当我在给定的输入上运行代码时,我看到了IndexError
  • 糟糕。已修复,抱歉。

标签: python arrays numpy vectorization


【解决方案1】:

这是使用broadcastingadvanced-indexing 的矢量化方法-

d0,d1,d2 = np.ogrid[:h,:w,:layers]
out = test[d0+c[0],d1+c[1],d2]

示例运行 -

In [112]: test = np.arange(200).reshape((10,10,2))
     ...: c = np.array([[0,1], [0, 1]])
     ...: 

In [113]: h=4
     ...: w=5
     ...: layers = 2
     ...: F = np.zeros((h,w,layers))
     ...: for k in range(layers):
     ...:     F[:,:,k] = test[c[0,k]:c[0,k]+h, c[1,k]:c[1,k]+w, k]
     ...:     

In [114]: d0,d1,d2 = np.ogrid[:h,:w,:layers]
     ...: out = test[d0+c[0],d1+c[1],d2]
     ...: 

In [115]: np.allclose(F, out)
Out[115]: True

【讨论】:

  • 当 h != w 时它似乎不起作用。我收到Index error: shape mismatch
  • @EgorIgnatenkov 确实是一个错误。更新。看看吧。
猜你喜欢
  • 2020-09-24
  • 2015-01-19
  • 2016-10-15
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2020-02-29
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多