有没有一种方法可以在给定两组角点索引坐标的情况下提取任意多维python数组的实心长方体切片?

o7jaxewo  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(261)

如果我有 a = np.arange(16).reshape(4,4) ,即

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

想要切片吗 a 就像我能做的那样 a[0:3,1:4] ,导致

array([[ 1,  2,  3],
       [ 5,  6,  7],
       [ 9, 10, 11]])

使用提供的坐标[(0,1),(2,3)],这是长方体切片的角的索引。
我想做一个函数,它接受任意n维数组和两组索引坐标,像这样在这两个坐标之间切片数组(可能是pythonic,我不包括最后一个索引,所以前面提到的索引坐标是[(0,1),(3,4)]。这个细节并不重要。)
举个例子:

import numpy as np

def box_slice(array, start, stop):
    # will return slice
    pass

a = np.arange(3*5*6).reshape(3,5,6)
``` `a` 是现在

array([[[ 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, 75, 76, 77],
    [78, 79, 80, 81, 82, 83],
    [84, 85, 86, 87, 88, 89]]])
这应该相当于 `a[0:3, 1:4, 2:5]` ,假设pythonic实现:

box_slice(a, [0,1,2], [3,4,5])

输出:

array([[[ 8, 9, 10],
[14, 15, 16],
[20, 21, 22]],

   [[38, 39, 40],
    [44, 45, 46],
    [50, 51, 52]],

   [[68, 69, 70],
    [74, 75, 76],
    [80, 81, 82]]])
这可以通过 `eval()` ,但我不想遵循这种方法,除非我必须这样做。是否已经有一个函数可以通过对输入的最小操作来实现这一点?我更喜欢numpy用法,但也鼓励使用其他库或原始python的解决方案。
解决方案需要支持任意数量的维度而不需要修改。
ohfgkhjo

ohfgkhjo1#

我不知道有没有一个简单的方法可以做到这一点,但你可以使用 __getitem__ 以及 zip 做这个。
这是在进行列表索引时大致内部发生的情况。它叫 __getitem__ 创造 slice 物体。 arr[1:3] == arr.__getitem__(slice(1, 3)) ```
import numpy as np

def box_slice(arr, start, stop):
return arr.getitem([slice(*i) for i in zip(start, stop)])

a = np.arange(16).reshape(4, 4)
print(box_slice(a, [0, 1], [3, 4]))

a = np.arange(3 * 5 * 6).reshape(3, 5, 6)
print(box_slice(a, [0, 1, 2], [3, 4, 5]))

输出

[[ 1 2 3]
[ 5 6 7]
[ 9 10 11]]

[[[ 8 9 10]
[14 15 16]
[20 21 22]]

[[38 39 40]
[44 45 46]
[50 51 52]]

[[68 69 70]
[74 75 76]
[80 81 82]]]

相关问题