python - numpy,数组不同层的不同切片

标签 python arrays numpy vectorization

我有 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]

最佳答案

这是利用 broadcasting 的矢量化方法和 advanced-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

关于python - numpy,数组不同层的不同切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698626/

相关文章:

python - 文本分析-无法将Python程序的输出写入csv或xls文件

c++ - 寻找有关函数定义和原型(prototype)中数组引用的说明

c# - 如何将 Byte* 从 C++ 转换为 C# 中的 Byte[]

java - 如何从列表 <object> 中删除重复项

python - 替换 numpy 数组中的一些值

python - 无法运行 openstack nova 的单元测试

python - 优先连接 Pandas 数据框

python - Tkinter 滚动条未正确填充或对齐

python - 如何从磁盘加载、处理数据,然后将数据与 python、pyqt、h5py 同时存储在一个通用的 hdf5 中?

python - 基于 Pandas Dataframe 中的多列计算公式 - 但不创建许多中间列