Python 如何获得;2d索引“;按元素值排序的二维数据数组的

Python 如何获得;2d索引“;按元素值排序的二维数据数组的,python,numpy-ndarray,Python,Numpy Ndarray,我有一个2d ndarray的ndarray,看起来像: array([[array([0]), array([0, 1]), array([0, 1]), None, None,array([0, 1])], [array([0, 1]), None, array([0, 1]), array([0, 1]), array([0, 1]),None], [None, None, array([0, 1]), None, None, None], [ar

我有一个2d ndarray的ndarray,看起来像:

array([[array([0]), array([0, 1]), array([0, 1]), None, None,array([0, 1])],
       [array([0, 1]), None, array([0, 1]), array([0, 1]), array([0, 1]),None],
       [None, None, array([0, 1]), None, None, None],
       [array([0, 1]), array([0, 1]), None, array([0, 1]), array([0, 1]),array([0, 1])],
       [array([0, 1]), None, None, None, array([0, 1]), None],
       [array([0, 1]), None, array([0, 1]), array([0, 1]), array([0, 1]),None]], dtype=object)
我的目标是获得元素的索引,按
len(element)
排序,同时跳过那些
None
的元素。比如:

array([[0,0], --> len= 1
       [0,1], --> len=2
       [0,2], --> len=2
       [0,5],  ...
       [1,0],
       [1,2],
       [1,3],
       [1,4], 
       ...   ])
我已尝试首先将元素转换为它们的
len
,这将为我们提供如下信息:

array([[1, 2, 2, 0, 0, 2],
       [2, 0, 2, 2, 2, 0],
       [0, 0, 2, 0, 0, 0],
       [2, 2, 0, 2, 2, 2],
       [2, 0, 0, 0, 2, 0],
       [2, 0, 2, 2, 2, 0]], dtype=object)
但是,我找不到一种有效的方法来生成索引列表(或者ndarray也可以)

请帮我做这个。我感谢任何能解决这个问题或给我一些线索的人。 编辑: 我找到了一个接近但并不完美的解决方案: 由于数据限制,“lenArray”的元素只能有3种值:1、2、inf。 因此,我可以利用这一点:

ones = np.column_stack(np.where(lenArray==1))
twos = np.column_stack(np.where(lenArray==2))
infs = np.column_stack(np.where(lenArray==inf))
sort_lenidx = np.concatenate((ones,twos,infs))
sort_lenidx将满足我的需求。 然而,这不是一个非常通用(如果可能的值nums非常大,这将是无用的)和优雅的方式来解决我的问题。我仍然希望有人能给我一个更好的方法。
我将感谢您以任何形式提供的帮助。

让我们调用包含长度的数组
lenArray

正确的方法是创建另一个二维数组-
rowNcol
,其中包含
lenArray
的行和列索引作为元素。然后,在
lenArray
上实现排序算法,并在
rowNcol
上执行相同的操作,以最终获得所需的索引数组

也就是说,您可以利用我们事先知道的事实,即
lenArray
中元素的类型(int)和范围,并以以下方式简单地迭代可能的元素:

来自numpy导入数组,amax
lenArray=数组([[1,2,2,0,0,2],
[2, 0, 2, 2, 2, 0],
[0, 0, 2, 0, 0, 0],
[2, 2, 0, 2, 2, 2],
[2, 0, 0, 0, 2, 0],
[2, 0, 2, 2, 2, 0]])
行,cols=lenArray.shape
lenMax=amax(lenArray)
对于范围内的lenVal(lenMax):
对于范围内的i(行):
对于范围内的j(cols):
如果(lenArray[i,j]==lenVal):
打印(str(i)+','+str(j))
但是,如果
lenArray
的大小非常大,这是非常低效的,因为您要反复解析它


编辑:我后来遇到了一个似乎完全符合您要求的数组。

让我们调用包含长度的数组
lenArray

正确的方法是创建另一个二维数组-
rowNcol
,其中包含
lenArray
的行和列索引作为元素。然后,在
lenArray
上实现排序算法,并在
rowNcol
上执行相同的操作,以最终获得所需的索引数组

也就是说,您可以利用我们事先知道的事实,即
lenArray
中元素的类型(int)和范围,并以以下方式简单地迭代可能的元素:

来自numpy导入数组,amax
lenArray=数组([[1,2,2,0,0,2],
[2, 0, 2, 2, 2, 0],
[0, 0, 2, 0, 0, 0],
[2, 2, 0, 2, 2, 2],
[2, 0, 0, 0, 2, 0],
[2, 0, 2, 2, 2, 0]])
行,cols=lenArray.shape
lenMax=amax(lenArray)
对于范围内的lenVal(lenMax):
对于范围内的i(行):
对于范围内的j(cols):
如果(lenArray[i,j]==lenVal):
打印(str(i)+','+str(j))
但是,如果
lenArray
的大小非常大,这是非常低效的,因为您要反复解析它


编辑:我后来发现了一个似乎完全符合您要求的选项。

谢谢您的回答。我尝试过numpy.argsort,但它只按每行返回“1d”索引组,而不是按我的需要返回。例如,np.argsort(lenArray)是数组([[3,4,0,1,2,5],[1,5,0,2,3,4],[0,1,3,4,5,2],[2,0,1,3,4,5],[1,2,3,5,0,4],[1,5,0,2,3,4]],dtype=int64)谢谢您的回答。我尝试过numpy.argsort,但它只按每行返回“1d”索引组,而不是按我的需要返回。例如,np.argsort(lenArray)是数组([[3,4,0,1,2,5],[1,5,0,2,3,4],[0,1,3,4,5,2],[2,0,1,3,4,5],[1,2,3,5,0,4],[1,5,0,2,3,4]],dtype=int64)