从numpy矩阵获取项目,该索引位于数组中

时间:2019-05-22 07:23:57

标签: python matlab numpy matrix

我正在尝试将Matlab代码转换为python,并且遇到了类似这样的代码:

a=[1 2 3;4 5 6;7 8 9]
b=[1, 4, 8]
a(b)
//output :
ans :
1   4   8

这实际上是从b获取索引并执行

a.item(x) #python

我要问的是,有什么办法可以在python中做到吗? 谢谢。 :)

3 个答案:

答案 0 :(得分:2)

注意:在编写此答案时,问题中给出的示例是错误的。 a(b)将导致:

ans =
   1   2   6

提供的MATLAB代码使用linear indexing,它使用列优先顺序,而声明的a.item(x) Python函数使用行主要顺序。

ind2sub MATLAB函数可以将线性索引转换为数组索引。类似的numpy函数是unravel_index

让我们看一下下面的示例代码。注意:Python使用基于0的索引,而MATLAB使用基于1的索引。

import numpy as np

a = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])
b = np.array([0, 3, 7])

c = a[np.unravel_index(b, a.shape, 'F')]

print(a)
print(b)
print(c)

[[10 20 30]
 [40 50 60]
 [70 80 90]]

[0 3 7]

[10 20 60]

答案 1 :(得分:1)

使用numpy

  • 首先将您的2D数组展平为1D
  • 然后使用b中的索引在a中查找数据
  • 注意:python中的索引从0开始,matlab1,因此您需要 将b中的索引减少1
    import numpy as np

    a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    a = a.flatten()
    b = np.array([1, 4, 8])

    print(a[b-1])

    #array([1, 4, 8])

答案 2 :(得分:0)

在八度会话中:

>> a=[1 2 3;4 5 6;7 8 9]
a =

   1   2   3
   4   5   6
   7   8   9

>> b=[1, 4, 8]
b =

   1   4   8

>> a(b)
ans =

   1   2   6

这不是我记得在MATLAB中遇到的那种行为,但是后来我不习惯使用大于维度的索引值。显然,它是在拼合矩阵中选择项目

>> reshape(a,1,9)
ans =

   1   4   7   2   5   8   3   6   9

>> reshape(a,1,9)(b)
ans =

   1   2   6

在Python / numpy中,索引是使用[]而不是()完成的。也是从0开始,而不是从1开始。

In [56]: a = np.arange(1,10).reshape(3,3)                                                                
In [57]: a                                                                                               
Out[57]: 
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
In [58]: b=[0,3,7]                                                                                       
In [59]: a.ravel(order='F')[b]                                                                           
Out[59]: array([1, 2, 6])
In [60]: a.ravel(order='F')                                                                              
Out[60]: array([1, 4, 7, 2, 5, 8, 3, 6, 9])

要在numpy中获得相同的值,我必须在展平数组时指定order F。这样,它将“扫描” MATLAB使用的列主顺序中的值。

在没有order F的情况下,默认扫描顺序为行主:

In [61]: a.ravel()                                                                                       
Out[61]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [62]: a.ravel()[b]                                                                                    
Out[62]: array([1, 4, 8])

最初重塑a时,我也可以得到订单F:

In [67]: a = np.arange(1,10).reshape(3,3,order='F')                                                      
In [68]: a                                                                                               
Out[68]: 
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
In [69]: a.flat[b]                                                                                       
Out[69]: array([1, 2, 6])

===

在MATLAB / Octave中,我们可以使用以下方法获得2d索引:

>> [r,c] = ind2sub([3,3],b)
r =

   1   1   2

c =

   1   2   3

>> a(1,1), a(1,2), a(2,3)
ans =  1
ans =  2
ans =  6

numpy中同样的拆解(适用于a的F阶版本):

In [75]: np.unravel_index(b, (3,3))                                                                      
Out[75]: (array([0, 1, 2]), array([0, 0, 1]))
In [76]: a[_]                    # using the Out[75] line as index                                                                        
Out[76]: array([1, 2, 6])
In [77]: a[0,0],a[1,0],a[2,1]            # equivalently                                                                
Out[77]: (1, 2, 6)