首页 > 解决方案 > numpy 当切片的每一行具有不同的列数时,如何从二维数组中获取元素?

问题描述

当切片的每一行具有不同的列数时,如何从二维数组中获取元素?

buffer = np.zeros((32, 32, 3), 'u1') # this is our data buffer 2d.

buffer[2:5, (2:4, 3:7, 0:11)] # does not work.

# vertical interval: 2..5; horizontal intervals: 1..3, 4..9, 7..10 
multi_intervals = ((2, 5), ((1, 3), (4, 9), (7, 10)))

# our very slowerest function.
def gen_xy_indices(y_interval, x_multi_intervals):
    x_multi_ranges = list(map(lambda x: np.arange(*x),x_multi_intervals))
    y_range = np.arange(*y_interval)

    y_indices = np.repeat(y_range, list(map(len, x_multi_ranges)))
    x_indices = np.concatenate(x_multi_ranges)

    return x_indices, y_indices

ix, iy = gen_xy_indices(*multi_intervals)
buffer[iy, ix].shape == (10, 3) # yeah work but slow.
# IS THERE A FASTER WAY TO DO THIS?! (in python with numpy)

标签: pythonnumpy

解决方案


这是您可以做到的一种方法:

x = range(2,5)
y = range(17)
divs = [(2,4), (3,7), (12,17)]
y_vals = []
x_vals = []
for d, div in enumerate(divs):
    y_grp = y[div[0]:div[1]]
    y_vals += y_grp
    x_vals += [x[d]]*len(y_grp)

print(x_vals)
print(y_vals)

> [2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4]
> [2, 3, 3, 4, 5, 6, 12, 13, 14, 15, 16]

推荐阅读