Numpy:作为Matlab的赋值和索引

2024-04-28 12:13:00 发布

您现在位置:Python中文网/ 问答频道 /正文

有时只为数组分配一个索引是很有用的。在Matlab中,这很简单:

M = zeros(4);
M(1:5:end) = 1
M =

   1   0   0   0
   0   1   0   0
   0   0   1   0
   0   0   0   1

在纽比有办法做到吗?首先,我想将数组展平,但该操作没有保留引用,因为它生成了一个副本。我尝试过使用ix,但我无法用相对简单的语法来实现。在


Tags: 副本语法zeros数组endixmatlab办法
3条回答

您可以尝试使用numpy.ndarray.flat,它表示一个迭代器,可以用来读写数组。在

>>> M = zeros((4,4))
>>> M.flat[::5] = 1
>>> print(M)
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

注意,在numpy中,切片语法是[开始:停止独占:step],与Matlab相反(开始:步骤:停止(包括在内)。在

基于sebergs的评论,有必要指出Matlab将矩阵存储在列major中,而numpy数组默认是row major。在

^{pr2}$

要在展平数组上获得类似Matlab的索引,需要展平转置数组:

>>> M = zeros((4,4))
>>> M.T.flat[:4] = 1
>>> print(M)
array([[ 1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.]])

可以使用列表索引来执行此操作:

M = np.zeros((4,4))
M[range(4), range(4)] = 1
print M
# [[ 1.  0.  0.  0.]
#  [ 0.  1.  0.  0.]
#  [ 0.  0.  1.  0.]
#  [ 0.  0.  0.  1.]]

在这种情况下,您还可以使用np.identity(4)

另一种使用unravel_索引的方法

>>> M = zeros((4,4));
>>> M[unravel_index(arange(0,4*4,5),(4,4))]= 1
>>> M
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])

相关问题 更多 >