通过切片扩展numpy数组的维度

Expanding dimension of numpy array by slicing

我有一个巨大的 numpy 数组 X,维度 (28000, 96, 96, 4)。此外,我有一个大小为 28000 的一维数组 users,其中包含 28000 个字符串条目,每个字符串条目表示一个特定的用户。例如:

X = numpy.random.rand(28000,96,96,4)
users = ["john"]*5666
users.extend(["doe"]*8421)
users.extend(["lea"]*3001)
users.extend(["rambo"]*10912)
users = numpy.array(users)

在这个例子中,只有4个用户,但实际上,我有80个用户。

现在我想通过对数组进行切片来创建一个额外的维度,这样最终的维度将是 (28000, n, 96, 96, 4)。对于每个用户,我想通过切片 n 元素来形成新的维度,例如 n = 3

Y[0,:,96,96,4] = X[0:2,:,:,:] # User John
Y[1,:,96,96,4] = X[1:3,:,:,:] # User John
Y[2,:,96,96,4] = X[2:4,:,:,:] # User John
...
Y[5663,:,96,96,4] = X[5663:5665,:,:,:] # User John
Y[5664,:,96,96,4] = X[5666:5668,:,:,:] # New user (Doe)
Y[5665,:,96,96,4] = X[5667:5669,:,:,:] # User Doe
...
Y[14083,:,96,96,4] = X[14085:14087,:,:,:] # User Doe
Y[14084,:,96,96,4] = X[14088:14091,:,:,:] # New user (lea)
...

可以看出,每个用户的前 n 个元素被跳过。

对于一般n(在运行时和内存消耗方面)是否有一种有效的方法来做到这一点?我不再需要原始数组 X,所以也许可以内联完成。

X = np.random.rand(28000,96,96,4)

Y = np.zeros((28000,2,96,96,4))
for i in range(28000):
    Y[i] = X[i:i+2]

strides = X.strides
strides = (strides[0],)+strides
Z = np.lib.stride_tricks.as_strides(X, Y.shape, strides=strides)

测试这个
np.allclose(Y,Z)

我用小得多的 X 测试了其中的一部分,并且只设置了几行 Y(你的完整 X 对我的机器来说太大了)。