numpy 把数组分成更小的段

vnjpjtjt  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(134)

我想取一个数组,并将每个连续成员之间的距离划分为更小的段,使得没有距离小于0。1.我尝试了以下代码:

arr = [0, 4.0, 4.5, 5.0, 8.05, 8.25]
n = 10

def create_segments(x, n0, i):
    return np.round(np.linspace(x[i], x[i + 1], n0 + 1), 2)

out = []
for j in range(len(arr)-1):
    xx = create_segments(arr, n, j)
    if any(i < 0.1 for i in np.diff(xx)):
        n = n -1
        out.append(create_segments(arr, n, j))
    else:
        out.append(xx)
result = np.unique(np.concatenate(out))
print('result', result)

代码的输出是[0. 0.4 0.8 1.2 1.6 2. 2.4 2.8 3.2 3.6 4. 4.06 4.11 4.17 4.22 4.28 4.33 4.39 4.44 4.5 4.56 4.62 4.69 4.75 4.81 4.88 4.94 5. 5.38 5.76 6.14 6.52 6.91 7.29 7.67 8.05 8.08 8.11 8.14 8.16 8.19 8.22 8.25],对于某些部分,例如arr[4]和arr[5]之间的最后一部分,仍然有小于0的距离。1.
如果有人提出建议来纠正代码,我很感激。

scyqe7ek

scyqe7ek1#

数组中的一些值的距离不够远,不足以容纳要将段划分成的值的数量。n只减1一次不会使它足够小,例如在4之间。0和4.5,则最多可以有5个中间值为0。1分开。
您可以直接计算出适当数量的分割值,而不是使用试错法:

out = []
for j in range(len(arr)-1):
    n = min(10,(arr[j+1]-arr[j])//0.1+1)
    xx = create_segments(arr, n, j)
    out.append(xx)

输出:

result [0.   0.4  0.8  1.2  1.6  2.   2.4  2.8  3.2  3.6  4.   4.1  4.2  4.3
 4.4  4.5  4.6  4.7  4.8  4.9  5.   5.3  5.61 5.92 6.22 6.52 6.83 7.14
 7.44 7.75 8.05 8.15 8.25]
diff [0.4  0.4  0.4  0.4  0.4  0.4  0.4  0.4  0.4  0.4  0.1  0.1  0.1  0.1
 0.1  0.1  0.1  0.1  0.1  0.1  0.3  0.31 0.31 0.3  0.3  0.31 0.31 0.3
 0.31 0.3  0.1  0.1 ]

如果你仍然想使用试错法,你需要在每一个段重置n,并在while循环中减少它:

out = []
for j in range(len(arr)-1):
    n = 10
    xx = create_segments(arr, n, j)    
    while any(i < 0.1 for i in np.diff(xx)):
        n = n -1
        xx = create_segments(arr, n, j)
    out.append(xx)

相关问题