gpt4 book ai didi

python - NumPy 数组的有效(非 NaN)部分的开始、停止索引切片

转载 作者:行者123 更新时间:2023-12-01 02:59:08 25 4
gpt4 key购买 nike

我有一个包含 nans 的大型 numpy 1d 数组。我需要知道所有不包含任何 nan 的切片:

 import numpy as np
A=np.array([1.0,2.0,3.0,np.nan,4.0,3.0,np.nan,np.nan,np.nan,2.0,2.0,2.0])

该示例的预期结果是:

 Slices=[slice(0,3),slice(4,6),slice(9,12)]

最佳答案

一种获取此类切片列表的方法,其思想是在列表理解中执行最少的工作 -

def start_stop_nonNaN_slices(A):
mask = ~np.isnan(A)
mask_ext = np.r_[False, mask, False]
idx = np.flatnonzero(mask_ext[1:] != mask_ext[:-1]).reshape(-1,2)
return [slice(i[0],i[1]) for i in idx]

示例运行 -

In [32]: A
Out[32]:
array([ 1., 2., 3., nan, 4., 3., nan, nan, nan, 2., 2.,
2.])

In [33]: start_stop_nonNaN_slices(A)
Out[33]: [slice(0, 3, None), slice(4, 6, None), slice(9, 12, None)]

In [35]: A
Out[35]:
array([ nan, 1., 2., 3., nan, 4., 3., nan, nan, nan, 2.,
2., 2.])

In [36]: start_stop_nonNaN_slices(A)
Out[36]: [slice(1, 4, None), slice(5, 7, None), slice(10, 13, None)]

以不同格式输出

我。如果您需要这些开始、停止索引作为元组对 -

def start_stop_nonNaN_slices_v2(A):
mask = ~np.isnan(A)
mask_ext = np.r_[False, mask, False]
idx = np.flatnonzero(mask_ext[1:] != mask_ext[:-1])
return zip(idx[::2], idx[1::2])

示例运行 -

In [51]: A
Out[51]:
array([ nan, 1., 2., 3., nan, 4., 3., nan, nan, nan, 2.,
2., 2., nan, nan])

In [52]: start_stop_nonNaN_slices_v2(A)
Out[52]: [(1, 4), (5, 7), (10, 13)]

二.如果您同意将开始索引和停止索引作为两个输出数组,并且这应该非常有效,因为我们避免了任何列表理解或压缩 -

def start_stop_nonNaN_slices_v3(A):
mask = ~np.isnan(A)
mask_ext = np.r_[False, mask, False]
idx = np.flatnonzero(mask_ext[1:] != mask_ext[:-1])
return idx[::2], idx[1::2]

示例运行 -

In [74]: A
Out[74]:
array([ nan, 1., 2., 3., nan, 4., 3., nan, nan, nan, 2.,
2., 2., nan, nan])

In [75]: starts, stops = start_stop_nonNaN_slices_v3(A)

In [76]: starts
Out[76]: array([ 1, 5, 10])

In [77]: stops
Out[77]: array([ 4, 7, 13])

性能注意事项:为了性能,我们可以使用np.concatenate来替换np.r_:

mask_ext = np.concatenate(( [False], mask, [False] ))

关于python - NumPy 数组的有效(非 NaN)部分的开始、停止索引切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43982063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com