Python numpy中的不规则切片

Python numpy中的不规则切片,python,pandas,numpy,slice,Python,Pandas,Numpy,Slice,考虑下面的numpy数组 a = np.arange(20) 切片要求如下所示 b = [[0,4], [4,9], [9,15], [15,19]] 如何根据'b'中的不规则切片信息对'a'进行切片?例如: np.mean(a[b[:,0]:b[:,1]]) 我知道如何用循环语句实现这一点,比如 [np.mean(a[b[_][0]:b[_][1]]) for _ in range(len(b))] 但是有没有一种方法可以避免使用循环?您可以使用np.ad

考虑下面的
numpy数组

a = np.arange(20)
切片要求如下所示

b = [[0,4],
     [4,9],
     [9,15],
     [15,19]]
如何根据
'b'
中的不规则切片信息对
'a'
进行切片?例如:

np.mean(a[b[:,0]:b[:,1]])
我知道如何用循环语句实现这一点,比如

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

但是有没有一种方法可以避免使用循环?

您可以使用
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循环:

有关更多信息,请参见
帮助(np.add.reduceat)
中的第一个示例:


您可以使用
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循环:

有关更多信息,请参见
帮助(np.add.reduceat)
中的第一个示例:


让我们试试
np.split

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

使用列表理解:


让我们试试
np.split

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

使用列表理解:


使用
cumsum
np.diff

c = b[:, 1]

np.diff(np.append(0, a.cumsum()[c - 1])) / np.diff(np.append(0, c))

array([  1.5,   6. ,  11.5,  16.5])

使用
cumsum
np.diff

c = b[:, 1]

np.diff(np.append(0, a.cumsum()[c - 1])) / np.diff(np.append(0, c))

array([  1.5,   6. ,  11.5,  16.5])

开始和停止总是一致的吗?问和迪瓦卡一样的问题。如果是这种情况,您可以只使用
np.split
np.split(a,b[:,1])
yes。开始总是重复前一行的停止。开始和停止是否总是重合?问与Divakar相同的问题。如果是这种情况,您可以只使用
np.split
np.split(a,b[:,1])
yes。启动将始终重复上一次的停止row@hpaulj道歉,在计算如何得到平均值时是一片空白,
map
是我所能想到的一切。(我知道这个解决方案的速度限制)。@SirajS。没问题!我不确定性能方面。如果您发现它对于您的用例来说太慢,请随意收回并使用Psidom的答案。@hpaulj抱歉,在计算如何获得平均值时是空白的,
map
是我所能想到的一切。(我知道这个解决方案的速度限制)。@SirajS。没问题!我不确定性能方面。如果您发现它对于您的用例来说太慢,请随意收回并使用Psidom的答案。绝对了解
ufunc.reduce
ufunc.reduceat
Thx!绝对了解了
ufunc.reduce
ufunc.reduceat
Thx!