首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对索引为数组的3d numpy数组进行切片和重塑

对索引为数组的3d numpy数组进行切片和重塑
EN

Stack Overflow用户
提问于 2021-09-24 23:50:29
回答 1查看 53关注 0票数 0

我有一个三维形状数组(3,5,5)。我需要切片使用不同的索引沿第二和第三轴的每一个3个元素

代码语言:javascript
运行
复制
ts = np.arange(25*3).reshape(3,5,5)
print(ts)
newr1 = np.array([1,0,2])
newr2 = np.array([3,2,4])

newc1 = np.array([1,2,0])
newc2 = np.array([3,4,2])

我想要像ts[:, newr1:newr2, newc1:newc2]这样的东西,但这种类型的切片只适用于标量索引。输出应如下所示。请指教

代码语言:javascript
运行
复制
array([[[ 6,  7,  8],
        [11, 12, 13],
        [16, 17, 18]],

       [[27, 28, 29],
        [32, 33, 34],
        [37, 38, 39]],

       [[60, 61, 62],
        [65, 66, 67],
        [70, 71, 72]]])
EN

回答 1

Stack Overflow用户

发布于 2021-09-25 05:14:30

好吧,我的好奇心占了上风。即使你没有提供你应该提供的信息,我也会想出答案的。

代码语言:javascript
运行
复制
In [10]: ts = np.arange(25*3).reshape(3,5,5)
    ...: print(ts)
    ...: newr1 = np.array([1,0,2])
    ...: newr2 = np.array([3,2,4])
    ...: 
    ...: newc1 = np.array([1,2,0])
    ...: newc2 = np.array([3,4,2])
    ...: 
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]
  [15 16 17 18 19]
  [20 21 22 23 24]]

 [[25 26 27 28 29]
  [30 31 32 33 34]
  [35 36 37 38 39]
  [40 41 42 43 44]
  [45 46 47 48 49]]

 [[50 51 52 53 54]
  [55 56 57 58 59]
  [60 61 62 63 64]
  [65 66 67 68 69]
  [70 71 72 73 74]]]

我猜你想要的是:

代码语言:javascript
运行
复制
In [11]: for i in range(3):
    ...:     x = ts[i,newr1[i]:newr2[i],newc1[i]:newc2[i]]
    ...:     print(x)
    ...: 
[[ 6  7]
 [11 12]]
[[27 28]
 [32 33]]
[[60 61]
 [65 66]]

好了,这差不多了,尽管你没有正确处理切片的终点。

linspace能够为输入数组生成“切片/阵列”:

代码语言:javascript
运行
复制
In [13]: np.linspace(newr1,newr2,3)
Out[13]: 
array([[1., 0., 2.],
       [2., 1., 3.],
       [3., 2., 4.]])

尝试使用这样的矩阵作为索引时会出现错误:

代码语言:javascript
运行
复制
In [14]: I=np.linspace(newr1,newr2,3)
In [15]: J=np.linspace(newc1,newc2,3)
In [16]: ts[np.arange(3)[:,None,None], I[:,:,None], J[:,None,:]]
Traceback (most recent call last):
  File "<ipython-input-16-5bc9e51832b8>", line 1, in <module>
    ts[np.arange(3)[:,None,None], I[:,:,None], J[:,None,:]]
IndexError: arrays used as indices must be of integer (or boolean) type

In [17]: I=np.linspace(newr1,newr2,3).astype(int)
In [18]: J=np.linspace(newc1,newc2,3).astype(int)
In [19]: I
Out[19]: 
array([[1, 0, 2],
       [2, 1, 3],
       [3, 2, 4]])
In [20]: J
Out[20]: 
array([[1, 2, 0],
       [2, 3, 1],
       [3, 4, 2]])

在犯了几个错误之后,我得出了以下结论:

代码语言:javascript
运行
复制
In [23]: ts[np.arange(3)[:,None,None], I.T[:,:,None], J.T[:,None,:]]
Out[23]: 
array([[[ 6,  7,  8],
        [11, 12, 13],
        [16, 17, 18]],

       [[27, 28, 29],
        [32, 33, 34],
        [37, 38, 39]],

       [[60, 61, 62],
        [65, 66, 67],
        [70, 71, 72]]])

因此,如果切片大小在“平面”上是一致的,我们可以使用一组适当的索引数组进行选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69322071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档