Python的方法来获取多个范围的numpy数组的最大值

5jdjgkvh  于 2023-04-30  发布在  Python
关注(0)|答案(2)|浏览(155)

我想从一个numpy数组中获取多个范围内的最大值和最小值。我找到了this解决方案,当范围均匀时,只获得多个范围的最大值。然而,我的范围并不总是一致的。
因此,如果有一个数组的数字为1-9,范围是索引[0-2], [3-6], [7-8],我想从每个范围中获得最大值和最小值。
我已经在下面发布了一个可能的解决方案,但我想知道是否有一个更pythonic的方法。

import numpy as np

a = np.array([1,2,3,4,5,6,7,8,9])
slices = [np.arange(0,3), np.arange(3,7), np.arange(7,9)]

max = np.empty(0)
min = np.empty(0)
for slice in slices:
    max.concatenate(np.max(a[slice]))
    min.concatenate(np.min(a[slice]))

min_and_max = np.concatenate(min,max)
eqzww0vc

eqzww0vc1#

假设输入数组是排序的,你可以使用numpy.searchsorted

a = np.array([1,2,3,4,5,6,7,8,9])
low = [0, 3, 7]
high = [2, 6, 8]

out = np.vstack([a[np.searchsorted(a, low, side='left')],
                 a[np.searchsorted(a, high, side='left')],
                 ])

输出:

array([[1, 3, 7],   # min
       [2, 6, 8]])  # max
mspsb9vt

mspsb9vt2#

ufunc.reduceat就是这样的:

>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> slices = np.array([0, 3, 7])
>>> np.maximum.reduceat(a, slices)
array([3, 7, 9])
>>> np.minimum.reduceat(a, slices)
array([1, 4, 8])
>>> np.vstack([np.minimum.reduceat(a, slices),
...            np.maximum.reduceat(a, slices)])
array([[1, 4, 8],
       [3, 7, 9]])

相关问题