我想将matlab代码转换成python代码。 matlab代码等效于以下玩具示例:
a = [1 2 3; 4 5 6; 7 8 9]
b = a(:, ones(1,3))
返回
a =
1 2 3
4 5 6
7 8 9
b =
1 1 1
4 4 4
7 7 7
我试图这样翻译:
from numpy import array
from numpy import ones
a = array([ [1,2,3], [4,5,6], [7,8,9] ])
b = a[:][ones((1,3))]
但它会返回以下错误消息:
回溯(最近通话最近): 文件“ example_slice.py”,第6行,在 b = a [:,个((1,3))] IndexError:用作索引的数组必须为整数(或布尔值)类型
编辑:在这种特殊情况下,也许应该用零代替,但这不是问题所在。这个问题解决了一个问题,即给数组a多次包含一个包含相同索引的列表,以便获得与使用Matlab计算的数组相同的数组b。
答案 0 :(得分:2)
也可以将MATLAB代码编写为(更习惯和更清晰地)为:
b = repmat(a(:,1),1,3);
b = np.tile(a[:,None,0],(1,3))
(请注意,None
会保留提取的矢量的方向。
答案 1 :(得分:1)
您可以将列表理解与np.full()
结合使用来创建某些值的数组。
import numpy as np
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = np.array([np.full(len(i), i[0]) for i in a])
print(b)
输出:
[[1 1 1]
[4 4 4]
[7 7 7]]
答案 2 :(得分:1)
In [568]: a = np.array([ [1,2,3], [4,5,6], [7,8,9] ])
In [569]: a[:,0]
Out[569]: array([1, 4, 7])
In [570]: a[:,[0,0,0]]
Out[570]:
array([[1, 1, 1],
[4, 4, 4],
[7, 7, 7]])
In [571]: a[:, np.zeros(3, dtype=int)] # int dtype to avoid your error
Out[571]:
array([[1, 1, 1],
[4, 4, 4],
[7, 7, 7]])
====
In [572]: np.zeros(3)
Out[572]: array([0., 0., 0.])
In [573]: np.zeros(3, int)
Out[573]: array([0, 0, 0])
较早的numpy版本允许使用浮点索引,但较新的版本已加强了要求。