您可以使用(濫用?)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