使用numpy.ones作为数组的索引

时间:2019-05-06 17:08:42

标签: python matlab numpy

我想将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。

3 个答案:

答案 0 :(得分:2)

也可以将MATLAB代码编写为(更习惯和更清晰地)为:

b = repmat(a(:,1),1,3);

In NumPy you'd write

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版本允许使用浮点索引,但较新的版本已加强了要求。