带有numpy的重复数组维度(不带np.repeat)

时间:2017-07-28 00:31:44

标签: python arrays numpy

我想复制一个numpy数组维度,但是原始和重复维度数组的总和仍然是相同的。例如,考虑一个n x m形状数组(a),我想将其转换为n x n x mb)数组,以便a[i,j] == b[i,i,j] 。很遗憾np.repeatnp.resize不适合这项工作。我可以使用另一个numpy函数,还是可以使用一些创意索引?

>>> import numpy as np
>>> a = np.asarray([1, 2, 3])
>>> a
array([1, 2, 3])
>>> a.shape
(3,)
# This is not what I want...
>>> np.resize(a, (3, 3))
array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

在上面的例子中,我想得到这个结果:

array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])

1 个答案:

答案 0 :(得分:2)

从1d到2d数组,您可以使用np.diagflat方法,使用展平输入创建二维数组作为对角线

import numpy as np
a = np.asarray([1, 2, 3])

np.diagflat(a)
#array([[1, 0, 0],
#       [0, 2, 0],
#       [0, 0, 3]])

更一般地说,您可以创建一个零数组并使用高级索引分配值:

a = np.asarray([[1, 2, 3], [4, 5, 6]])

result = np.zeros((a.shape[0],) + a.shape)
idx = np.arange(a.shape[0])
result[idx, idx, :] = a

result
#array([[[ 1.,  2.,  3.],
#        [ 0.,  0.,  0.]],

#       [[ 0.,  0.,  0.],
#        [ 4.,  5.,  6.]]])