2010-11-06 42 views
8

numpy.unravel_index()將一個形狀和一個平面索引放入一個數組中,並返回表示該數組中索引的元組。有沒有反過來?我可以手工計算它,但這似乎是它必須是某處的內置函數...NumPy是否具有unravel_index()的逆?

+1

我想你應該使用'ravel_multi_index'更新接受的答案之一;大多數人現在會使用'NumPy 1.6'或更新的版本。 – gerrit 2016-10-26 16:51:02

回答

7

由於numpy 1.6.0(2011年5月)有一個內置的NumPy的功能ravel_multi_index

索引陣列的元組轉換成平索引的陣列,將邊界模式到多指數。

(這是由用戶雙波多黎各評論也提到,但確實應該出現一個答案)

2
+1

不可靠。當你使用數組片時,numpy通常會共享相同的數據,並執行大步技巧。比較arange(15).reshape((3,5))。strides(這將是一個很好的連續數組)和arange(35).reshape((7,5))[1 :: 2,:]。 。 – 2010-11-06 19:18:10

+0

的確如此,而對此的不可見性可能是一種真正的痛苦。但是如果你正在計劃自己的步法(正如我在這裏),希望你能保證陣列是連續的。 – D0SBoots 2010-11-10 10:21:52

3

這工作:

def ravel_index(pos, shape): 
    res = 0 
    acc = 1 
    for pi, si in zip(reversed(pos), reversed(shape)): 
     res += pi * acc 
     acc *= si 
    return res 
1

這不是一個內置的命令,但我一直使用下面的代碼片段,假設正在使用numpy的默認行主索引:

np.sum(np.array(index_tuple[:-1])*np.array(a_matrix.shape[1:]))+np.array(index_tuple[-1]) 

For Fortan-like(column-major)indexing,the index just need to be swap:

np.sum(np.array(index_tuple[1:])*np.array(a_matrix.shape[:-1]))+np.array(index_tuple[0]) 

在上面,index_tuple和a_matrix分別是包含感興趣的索引和被索引的矩陣的元組。這並沒有上面的問題與切片拍攝時的步幅相關聯。

+2

從numpy 1.6開始,它是一個內置命令'numpy.ravel_multi_index',http://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel_multi_index.html 但這個問題很老。 – 2012-03-19 18:21:11

+0

謝謝,我沒有注意到新命令,所以這對我非常有用。 – 2012-04-19 14:25:19