首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据2d numpy数组的值对python中的函数进行排序

如何根据2d numpy数组的值对python中的函数进行排序
EN

Stack Overflow用户
提问于 2021-12-30 06:02:58
回答 3查看 82关注 0票数 1

假设我有一个NumPy数组:

代码语言:javascript
复制
[[7 2]
 [7 3]
 [2 8]
 [4 3]
 [5 5]] 

其中第0指数为x值,第1索引为y值。如何对这些值进行排序,以便当我将它们放入函数中时: (x ^2 +y-11)^2+(x+y^2-7)^2,它们根据结果按升序排序?所以排序后的值如下所示:

代码语言:javascript
复制
[[4 3]
 [5 5]
 [7 2]
 [7 3]
 [2 8]]

数组可以有重复的。

我的想法之一是使用.argsort()方法,尽管我不知道如何实现这个方法。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-30 06:20:23

您可以应用沿着第一个轴的函数,得到一个具有函数值的一维数组。将结果传递给np.argsort()将为您提供适当的排序索引:

代码语言:javascript
复制
a = np.array([
     [7, 2],
     [7, 3],
     [2, 8],
     [4, 3],
     [5, 5]] 
)

def my_func(row):
    x, y = row
    return (x ** 2 + y - 11) ** 2 + (x + y ** 2) ** 2

f = np.apply_along_axis(my_func, 1, a)
# array([1721, 1937, 4357,  233, 1261])

indices = np.argsort(f)
# array([3, 4, 0, 1, 2])

a[indices]
# array([[4, 3],
#        [5, 5],
#        [7, 2],
#        [7, 3],
#        [2, 8]])

Per @mozway的comment...this非常快,因为它允许Numpy将函数向量化:

代码语言:javascript
复制
x,y = a.T
aa = (x ** 2 + y - 11) ** 2 + (x + y ** 2) ** 2 
indices = np.argsort(aa)
a[indices]

结果是一样的。

票数 3
EN

Stack Overflow用户

发布于 2021-12-30 06:53:13

因此,这是可行的:

代码语言:javascript
复制
def f(x, y):
return (x**2 + y- 11)**2 + (x + y**2 -7)**2


def sortTuples(TupleList):
    output = [0, 0, 0, 0, 0]
    indexList = []
    for i in TupleList:
        x = i[0]
        y = i[1]
        indexList.append(f(x, y))
    indexList.sort()
    for i in TupleList:
        output[indexList.index(f(i[0], i[1]))] = i
    return output

希望你能找到一个更好的方法来做这件事!

票数 1
EN

Stack Overflow用户

发布于 2021-12-30 07:26:51

至少对于小型数组,sortednp.argsort更有竞争力(特别是如果列表足以满足您的任务):

代码语言:javascript
复制
out = sorted(arr.tolist(), key=lambda x: (x[0]**2+x[1]-11)**2+(x[0]+x[1]**2-7)**2)

输出:

代码语言:javascript
复制
[[4, 3], [5, 5], [7, 2], [7, 3], [2, 8]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70527981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档