我想复制一个numpy数组维度,但是原始和重复维度数组的总和仍然是相同的。例如,考虑一个n x m
形状数组(a
),我想将其转换为n x n x m
(b
)数组,以便a[i,j] == b[i,i,j]
。很遗憾np.repeat
和np.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]])
答案 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.]]])