我正在尝试将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中做到吗? 谢谢。 :)
答案 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)
2D
数组展平为1D
b
中的索引在a
中查找数据python
中的索引从0
开始,matlab
是1
,因此您需要
将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)