2024-04-28 12:13:00 发布
网友
有时只为数组分配一个索引是很有用的。在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,但我无法用相对简单的语法来实现。在
您可以尝试使用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。在
要在展平数组上获得类似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)
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.]])
您可以尝试使用numpy.ndarray.flat,它表示一个迭代器,可以用来读写数组。在
注意,在numpy中,切片语法是[开始:停止独占:step],与Matlab相反(开始:步骤:停止(包括在内)。在
基于sebergs的评论,有必要指出Matlab将矩阵存储在列major中,而numpy数组默认是row major。在
^{pr2}$要在展平数组上获得类似Matlab的索引,需要展平转置数组:
可以使用列表索引来执行此操作:
在这种情况下,您还可以使用
np.identity(4)
另一种使用unravel_索引的方法
相关问题 更多 >
编程相关推荐