Numpy:从第(m)个维度中删除最后(n)个元素

2024-06-16 14:11:36 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我的代码如下所示:

import numpy as np
data = np.load('Tbars.npy')
print(np.shape(data))

我得到的结果是(50,500,130)

我想去掉y维度(500)中的最后10个元素;所以我得到了(50,490,130)


Tags: 代码importnumpy元素dataasnpload
1条回答
网友
1楼 · 发布于 2024-06-16 14:11:36

初始答案,针对要删除的固定维度和要删除的元素数

运行:

data[:, :-10, :]

:-10是选择相应维度中所有元素的方法, 除了最后10个

较小尺寸数据的示例:

创建大小为(2,10,3)的数组:

dims = (2, 10, 3)
data = np.arange(dims[0] * dims[1] * dims[2]).reshape(dims)

因此,它包含:

array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23],
        [24, 25, 26],
        [27, 28, 29]],

       [[30, 31, 32],
        [33, 34, 35],
        [36, 37, 38],
        [39, 40, 41],
        [42, 43, 44],
        [45, 46, 47],
        [48, 49, 50],
        [51, 52, 53],
        [54, 55, 56],
        [57, 58, 59]]])

然后检索第二维度中除最后一个2之外的数据元素:

b = data[:, :-2, :]

结果是:

array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17],
        [18, 19, 20],
        [21, 22, 23]],

       [[30, 31, 32],
        [33, 34, 35],
        [36, 37, 38],
        [39, 40, 41],
        [42, 43, 44],
        [45, 46, 47],
        [48, 49, 50],
        [51, 52, 53]]])

而且b.shape(2, 8, 3)

更一般的解决方案

如果要删除nDim维度中的最后一个nDrop元素 在arr数组中,定义一个函数:

def myDrop(arr, nDim, nDrop):
    idx = [slice(None)] * arr.ndim
    idx[nDim] = slice(None, -nDrop)
    return arr[tuple(idx)]

然后,检索一个数据切片,其中没有最后10个元素 尺寸1,运行:

b = myDrop(data, 1, 10)

与上述结果相同

如果您想要更短的函数(实际上是一个单行程序),请将其定义为:

def myDrop2(arr, nDim, nDrop):
    return arr[tuple([slice(None, -nDrop) if i == nDim else slice(None) for i in range(arr.ndim)])]

相关问题 更多 >