考虑以下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))]
但有哪种方法可以避免使用循环?
答案 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