我有两个数组 a 和 b。 a 是形状 (2,4),b 是形状 (4,):
我想填充第三个数组 h 以便:
h = np.array([[a[0,0], a[1,2], 0, 0, a[0,2], a[0,3], 0],
[a[1,0], a[2,2], 0, 0, a[1,2], a[1,3], 0],
[ b[0], b[1], 0, 0, b[2], b[3], 0]])
我目前执行以下操作:
hs = np.hsplit(np.vstack((a, b)), 2)
h = np.zeros((3, 8)) # Allocate the array
h[:, 0:2] = hs[0]
h[:, 5:7] = hs[1]
有没有更有效(速度/内存明智)的方法来做到这一点?
谢谢。
(编辑):放置索引以更好地理解
答案 0 :(得分:0)
你可以不用定义hs:
h = np.zeros((3, 7))
h[0:2,(0,1,4,5)] = a
h[2,(0,1,4,5)] = b
或不带 a 和 b:
h = np.zeros((3, 7))
h[0:2,(0,1,4,5)] = 1
h[2,(0,1,4,5)] = 2
输出:
[[1. 1. 0. 0. 1. 1. 0.]
[1. 1. 0. 0. 1. 1. 0.]
[2. 2. 0. 0. 2. 2. 0.]]
答案 1 :(得分:0)
沿特定索引放置内容的两种常用方法是索引和掩码。
要使用掩码,请定义类似
m = np.array([True, True, False, False, True, True, False])
然后你就可以了
h = np.zeros((a.shape[0] + b.shape[0], m.size))
h[:a.shape[0], m] = a
h[-b.shape[0]:, m] = b
要使用索引,您需要执行类似的操作,但您需要知道输出的总大小:
i = [0, 1, 4, 5]
h = np.zeros((a.shape[0] + b.shape[0], 7))
h[:a.shape[0], i] = a
h[-b.shape[0]:, i] = b
在这两种情况下,您都可以预先堆叠输入,但这对您的时间或内存没有帮助:
x = np.concatenate((a, b[None, :]), axis=0)
h[:, m] = x