将n维numpy数组转换为二维索引数组

时间:2016-02-19 22:24:20

标签: python arrays numpy

我想转换一个n维的numpy数组,例如:

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

axis_0_indexaxis_1_indexcell_value的二维数组。

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

这可以在NumPy中轻松完成吗?

2 个答案:

答案 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]])