【问题标题】:Rank values in a 2D array对二维数组中的值进行排名
【发布时间】:2013-07-22 18:39:28
【问题描述】:

嗨,基本上我想输入一个二维数组,然后创建一个新的排名数组,其值从最低到最高。

我使用的数组是转换为 numpyarray 的高程栅格。这个数组有一个海拔值。我只想按海拔排序。下面是我在代码中取得的进展,但它并没有生成我想要的!

import arcpy
import numpy

array = arcpy.RasterToNumPyArray(r"C:\Current\SedMod\SedModv3\TestModel.gdb\Smallprepfin_Clip")

order = array.argsort()
ranks = order.argsort()

print ranks

感谢您的帮助!

补充说明:

我想对数组中包含的所有值从最大值到最小值进行排序,但要保持数组的索引和形状。

即如果有 100 个值,则最高值(海拔)将是 1 级,最低的 100 级!

【问题讨论】:

  • 您希望结果是一维数组吗?
  • 补充说明:我想将数组中包含的所有值从最大值排序到最小值,但保持数组的索引和形状。即,如果有 100 个值,则最高值(海拔)将是 1 级,最低的 100 级!

标签: python sorting numpy ranking arcpy


【解决方案1】:

这样的事情怎么样:

>>> a
array([[ 0.76303184,  0.17748702,  0.89365504,  0.07221609],
       [ 0.12267359,  0.56999037,  0.42877407,  0.8875015 ],
       [ 0.38178661,  0.57648393,  0.47056551,  0.03178402],
       [ 0.03606595,  0.93597727,  0.02199706,  0.73906879]])
>>> a.ravel().argsort().argsort().reshape(a.shape)
array([[12,  5, 14,  3],
       [ 4,  9,  7, 13],
       [ 6, 10,  8,  1],
       [ 2, 15,  0, 11]])

对此不太满意,可能有更好的方法。

【讨论】:

  • 补充说明:我想将数组中包含的所有值从最大值排序到最小值,但保持数组的索引和形状。即,如果有 100 个值,则最高值(海拔)将是 1 级,最低的 100 级!
  • 所以对于你的数组,我最终会得到类似:array([[ 14, 13, 15, 7], [ 2, 12, 1, 16 ], [ 5, 6, 11, 3], [4, 9, 8, 10]])
  • 嗯,我似乎无法让它工作,你能用这样的代码编写它吗: import arcpy import numpy array = ([[ 0.76303184, 0.17748702, 0.89365504, 0.07221609], [ 0.12267359, 0.56999037 ,0.42877407,0.8875015],[0.38178661,0.57648393,0.03706551,0.03178402],[0.03606551,0.03178402],0.93597727,0.02199706,0.02199706,0.02199706,0.02199706,0.73906879])Sorted_Array = Numpy.ravel(A).Argsort()。Rehsort()。Rehape(A.Shape)。Rehape(A.Shape)打印 sorted_array
  • >>>一个[[0.76303184,0.17748702,0.89365504,0.07221609],[0.12267359,0.56999037,0.42877407,0.8875015],[0.38178661,0.57648393,0.47056551,0.03178402],[0.03606595,0.93597727,0.02199706, 0.73906879]] >>> a.ravel().argsort().argsort().reshape(a.shape) Traceback(最近一次调用最后):文件“”,第 1 行,在 AttributeError : 'list' 对象没有属性 'ravel'
  • 您需要将 list 的列表转换为 numpy 数组。 array=numpy.array(array)。在此注释中,我不会将数组命名为 array 或者 arr 或其他变量。
【解决方案2】:

你需要 scipy.stats.rankdata 来做这个

from scipy.stats import rankdata
ranks=rankdata(a).reshape(a.shape)

要从最高到最低排名,请反转输入 a

ranks=rankdata(a.max()-a).reshape(a.shape)

【讨论】:

    猜你喜欢
    • 2013-08-17
    • 2011-10-25
    • 2015-09-17
    • 1970-01-01
    • 2020-06-26
    • 2017-05-25
    相关资源
    最近更新 更多