根据另一个数组的索引,将一个数组的子元素重新定位到不同的行中?

时间:2017-01-21 19:51:17

标签: python numpy

我正在尝试使用this post中的方法调整我创建的数组的顺序。

基本上取决于数组的行索引(其中axis = 0),该索引的子元素已被删除(例如,如果查看索引1,则仅存在元素0和2)。

我需要一种方法将每个元素放回到与其原始索引相对应的行中。

>>> a = array([[[222],[333]],
               [[111],[333]],
               [[111],[222]]])

期望的输出:

>>> a = array([[[111],[111]],
               [[222],[222]],
               [[333],[333]]])

在我的尝试中,我认为这可能会越来越近了:

>>> n = a.shape[0]
>>> row_idx = np.nonzero(~np.eye(n,dtype=bool))[1].reshape(n,n-1) # dim0 indices

>>> print a.ravel() #flatten the array 
[222, 333, 111, 333, 111, 222]
>>> print row_idx #somehow use these indices to reposition corresponding elements
[1    2    0    2    0    1]

我不确定如何使用row_idx将元素对齐到相应的行中,或者这是否是一种有效的方法呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

使用展平的<?php namespace MyDomain\Model; class Employee { } ?> 来获取 reverse-argsort ,然后使用它直接索引到展平的row_idx,最后重塑 -

a

分步运行 -

1)扁平化数组和索引:

a.ravel()[row_idx.ravel().argsort()].reshape(a.shape)

2)我们需要找到扁平In [72]: a.ravel() Out[72]: array([222, 333, 111, 333, 111, 222]) In [73]: row_idx.ravel() Out[73]: array([1, 2, 0, 2, 0, 1]) 的置换版本,让我们称之为a,以便a0a0[1] = 222等等。要查找那些置换索引,我们需要在展平a0[2] = 333上使用argsort。因此,使用这些作为最终输出的row_idx索引。为了以多维格式返回输出,我们需要最终重塑:

a