使用numpython进行切片并获取最大值

2024-04-25 14:41:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用numpy编写一个代码,它在其中输出索引之间的最大值。我认为使用argmax是可行的。但是,我不知道如何在python中使用切片而不使用for循环。如果有这方面的功能,它也可以使用。我想使计算尽可能快

list_ = np.array([9887.89, 9902.99, 9902.99, 9910.23, 9920.79, 9911.34, 9920.01, 9927.51, 9932.3, 9932.33, 9928.87, 9929.22, 9929.22, 9935.24, 9935.24, 9935.26, 9935.26, 9935.68, 9935.68, 9940.5])
indexes = np.array([0, 5, 10, 19])

预期结果:

Max number between index(0 - 5):  9920.79 at index 5
Max number between index(5 - 10): 9932.33 at index 10
Max number between index(10 - 19): 9940.5 at index 19

Tags: 代码功能numpynumberforindexnp切片
2条回答

假设在索引数组中指定了第一个(零)索引和最后一个索引

import numpy as np

list_ = np.array([9887.89, 9902.99, 9902.99, 9910.23, 9920.79, 9911.34, 9920.01, 9927.51, 9932.3, 9932.33, 9928.87, 9929.22, 9929.22, 9935.24, 9935.24, 9935.26, 9935.26, 9935.68, 9935.68, 9940.5])
indexes = np.array([0, 5, 10, 19])

chunks = np.split(list_, indexes[1:-1])
print([c.max() for c in chunks])

max_ind = [c.argmax() for c in chunks]
print(max_ind + indexes[:-1])

没有必要让每个块都具有相同的大小和任意的索引规格。因此,numpy的矢量化优势将以这样或那样的方式消失(因为你不可能有一个numpy数组,其中每个元素在内存中的大小都不同,这也有矢量化的所有优势)

我认为至少有一个for循环是必要的。但是,您可以使用“拆分”,使拆分成为一个numpy优化操作

您可以直接在阵列中使用reduceat,而无需拼接/拆分阵列:

np.maximum.reduceat(list_,indexes[:-1])

输出:

array([9932.33, 9929.22, 9940.5 ])

相关问题 更多 >