numpy不规则切片

时间:2017-10-11 19:52:01

标签: python pandas numpy slice

考虑以下numpy array

a = np.arange(20)

并且切片要求在下面给出

b = [[0,4],
     [4,9],
     [9,15],
     [15,19]]

如何基于'a'中的不规则切片信息对'b'进行切片?例如:

np.mean(a[b[:,0]:b[:,1]])

我知道如何用循环语句实现这一点,比如

[np.mean(a[b[_][0]:b[_][1]]) for _ in range(len(b))]

但有哪种方法可以避免使用循环?

3 个答案:

答案 0 :(得分:3)

您可以将np.add.reduceat与展平b一起用作索引:

np.add.reduceat(a, np.ravel(b))[::2]/np.diff(b, axis=1).ravel()
# array([  1.5,   6. ,  11.5,  16.5])

使用 for loop

[np.mean(a[b[_][0]:b[_][1]]) for _ in range(len(b))]
# [1.5, 6.0, 11.5, 16.5]

有关详情,请参阅help(np.add.reduceat)中的第一个示例:

Examples
--------
To take the running sum of four successive values:

>>> np.add.reduceat(np.arange(8),[0,4, 1,5, 2,6, 3,7])[::2]
array([ 6, 10, 14, 18])

答案 1 :(得分:1)

让我们试试np.split

>>> list(map(np.mean, np.split(a, b[:, 1])))
[1.5, 6.0, 11.5, 16.5, 19.0]

使用列表理解

>>> [np.mean(x) for x in np.split(a, b[:, 1])]
[1.5, 6.0, 11.5, 16.5, 19.0]

答案 2 :(得分:0)

使用Math.max.call(null, ...myArray)cumsum

np.diff