【问题标题】:Expanding dimension of numpy array by slicing通过切片扩展numpy数组的维度
【发布时间】:2021-03-19 20:08:50
【问题描述】:

我有一个巨大的 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 切片都有形状(2,96,96,4),所以Y 形状应该是(28000,2,96,94,4)。我不认为user 分组有什么不同。如果我的图片是正确的,我认为X 可以在as_stridedY 形状中查看,但要实现这些步骤需要一些思考。

标签: python numpy numpy-ndarray numpy-slicing


【解决方案1】:
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 对我的机器来说太大了)。

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2021-11-23
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多