我想转换一个n维的numpy数组,例如:
[ [ a, b, c],
[ d, e, f] ]
到axis_0_index
,axis_1_index
,cell_value
的二维数组。
[ [ 0, 0, a],
[ 0, 1, b],
[ 0, 2, c],
[ 1, 0, d],
[ 1, 1, e],
[ 1, 2, f] ]
这可以在NumPy中轻松完成吗?
答案 0 :(得分: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 :(得分: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]])