Python 如何获得;2d索引“;按元素值排序的二维数据数组的
我有一个2d ndarray的ndarray,看起来像: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
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)