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!