python - 如何操作以下 numpy.where 数组

标签 python arrays numpy

我有一个索引数组,如下所示:

indices=np.where(f!=1)

给出以下数组:

(array([ 249,  250,  251,  252,  253,  254,  804,  805,  806,  807,  808,
        809, 1365, 1366, 1367, 1368, 1369, 1860, 1861, 1862, 1863, 1864,
       2424, 2425, 2426, 2427, 2428, 2948, 2949, 2950, 2951, 2952, 2953,
       3501, 3502, 3503, 3504, 3505, 3506, 4061, 4062, 4063, 4064, 4065,
       4555, 4556, 4557, 4558, 4559, 5111, 5112, 5113, 5114, 5115, 5116,
       6188, 6189, 6190, 6191, 6752, 6753, 6754, 6755, 6756, 7261, 7262,
       7263, 7264, 7265, 7821, 7822, 7823, 7824, 7825, 7826, 8385, 8386,
       8387, 8388, 8389]),)

这个阵列基本上是光变曲线中的凹陷。我想在每次下降的两侧再选择两个指数。所以基本上数组看起来如下:

(array([ **247, 248**, 249,  250,  251,  252,  253,  254, **255, 256**, **802, 803**, 804,  805,  806,  807,  808, 809, **810, 811** etc....]),)

最佳答案

首先,获取索引作为数组:

indices=np.where(f!=1)[0] # or use np.flatnonzero

所以,我们会 -

In [804]: indices
Out[804]: 
array([ 249,  250,  251,  252,  253,  254,  804,  805,  806,  807,  808,
        809, 1365, 1366, 1367, 1368, 1369, 1860, 1861, 1862, 1863, 1864,
       2424, 2425, 2426, 2427, 2428, 2948, 2949, 2950, 2951, 2952, 2953,
       3501, 3502, 3503, 3504, 3505, 3506, 4061, 4062, 4063, 4064, 4065,
       4555, 4556, 4557, 4558, 4559, 5111, 5112, 5113, 5114, 5115, 5116,
       6188, 6189, 6190, 6191, 6752, 6753, 6754, 6755, 6756, 7261, 7262,
       7263, 7264, 7265, 7821, 7822, 7823, 7824, 7825, 7826, 8385, 8386,
       8387, 8388, 8389])

接下来,我们需要获取每个下降的开始和停止位置。然后,通过一些广播获得扩展号码。最后,简单地插入那些带有连接和排序的。

因此,实现将是 -

idx = np.r_[0,np.flatnonzero(np.diff(indices) > 1)+1,len(indices)]
start_pad = indices[idx[:-1]][:,None] + range(-2,0)
stop_pad = indices[idx[1:]-1][:,None] + range(1,3)
out = np.sort(np.r_[start_pad.ravel(), indices, stop_pad.ravel()])

输出将是 -

In [832]: out
Out[832]: 
array([ 247,  248,  249,  250,  251,  252,  253,  254,  255,  256,  802,
        803,  804,  805,  806,  807,  808,  809,  810,  811, 1363, 1364,
       1365, 1366, 1367, 1368, 1369, 1370, 1371, 1858, 1859, 1860, 1861,
       1862, 1863, 1864, 1865, 1866, 2422, 2423, 2424, 2425, 2426, 2427,
       2428, 2429, 2430, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953,
       2954, 2955, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, 3507,
       3508, 4059, 4060, 4061, 4062, 4063, 4064, 4065, 4066, 4067, 4553,
       4554, 4555, 4556, 4557, 4558, 4559, 4560, 4561, 5109, 5110, 5111,
       5112, 5113, 5114, 5115, 5116, 5117, 5118, 6186, 6187, 6188, 6189,
       6190, 6191, 6192, 6193, 6750, 6751, 6752, 6753, 6754, 6755, 6756,
       6757, 6758, 7259, 7260, 7261, 7262, 7263, 7264, 7265, 7266, 7267,
       7819, 7820, 7821, 7822, 7823, 7824, 7825, 7826, 7827, 7828, 8383,
       8384, 8385, 8386, 8387, 8388, 8389, 8390, 8391])

关于python - 如何操作以下 numpy.where 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46513115/

相关文章:

python将时间添加到已经运行的倒计时

具有列表理解的Python字典值分配

c - 二维数组,按总和对行进行排序

python - 尝试将矩阵 1*3 转换为列表

python - 使用python解析文件

python - 如何使用 asyncio 等待套接字的错误/关闭事件?

c++ - 将二维数组传递给类成员函数

javascript - 在javascript中将多行数字字符串转换为双数组

python - 如何在 python 中使用另一个列表上的一个列表运行模条件

python - 使用 x 轴偏移在 python (5GB) 中绘制非常大的文件