2016-02-19 210 views
3

我想n維numpy的數組轉換像這樣的:轉換n維numpy的陣列,以2維索引陣列

[ [ a, b, c], 
    [ d, e, f] ] 

到的axis_0_index 2維陣列,axis_1_indexcell_value

[ [ 0, 0, a], 
    [ 0, 1, b], 
    [ 0, 2, c], 
    [ 1, 0, d], 
    [ 1, 1, e], 
    [ 1, 2, f] ] 

這是可能在NumPy中輕鬆做到的嗎?

回答

1

您可以使用(濫用?)np.where獲取數組的所有索引,使用與條件相同形狀的數組,然後將這些索引與(展平)數組堆棧並最終轉置。

>>> A = np.array([ [ 'a', 'b', 'c'], [ 'd', 'e', 'f'] ]) 
>>> ones = np.ones(A.shape) 
>>> np.vstack(np.where(ones) + (A.ravel(),)).transpose() 
array([['0', '0', 'a'], 
     ['0', '1', 'b'], 
     ['0', '2', 'c'], 
     ['1', '0', 'd'], 
     ['1', '1', 'e'], 
     ['1', '2', 'f']], 
     dtype='|S1') 

經過一番更多的搜索,它可能是清潔劑使用np.indices

>>> X, Y = np.indices(A.shape) 
>>> np.vstack((X.ravel(), Y.ravel(), A.ravel())).T 

>>> np.vstack((X, Y, A)).reshape(3,A.size).T 

結果,在這兩種情況下,是與上述相同。


我做了一些時間分析,使用IPython的%timeit。奇怪的是,我與where第一個解決方案似乎是最快的,至少在這個非常小的測試序列:

>>> %timeit f1() # using ones and np.where 
10000 loops, best of 3: 72.3 us per loop 
>>> %timeit f2() # using np.indices and ravel 
10000 loops, best of 3: 125 us per loop 
>>> %timeit f3() # using np.indices and reshape 
10000 loops, best of 3: 110 us per loop 
>>> %timeit g() # using meshgrid 
10000 loops, best of 3: 134 us per loop 
1

您可以使用np.meshgrid如下圖所示樣品運行 -

In [19]: A 
Out[19]: 
array([[19, 80, 63], 
     [24, 54, 44]]) 

In [20]: m,n = A.shape 

In [21]: R,C = np.meshgrid(np.arange(m),np.arange(n)) 

In [22]: np.column_stack((R.ravel('F'),C.ravel('F'),A.ravel())) 
Out[22]: 
array([[ 0, 0, 19], 
     [ 0, 1, 80], 
     [ 0, 2, 63], 
     [ 1, 0, 24], 
     [ 1, 1, 54], 
     [ 1, 2, 44]])