Numpy 数组,掩码填充

时间:2021-03-12 11:39:04

标签: python arrays numpy

我有两个数组 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]

有没有更有效(速度/内存明智)的方法来做到这一点?

谢谢。

(编辑):放置索引以更好地理解

2 个答案:

答案 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