删除所有行和列中的最后一项 numpy.ndarray

delete last item in all rows and columns numpy.ndarray

我正在尝试删除 numpy.ndarray (type = class numpy.ndarray) 中行和列中的最后一项。我的数组有 30 行和 180 列(即每行 180 个值)。我试过 numpy.delete 但这只是删除了整个 row/column.

为了说明我想要实现的目标,我在 Python 中使用数组和嵌套 for 循环创建了以下示例:

a = np.array([[[1,2,3,4,5,6],[1,2,3,4],[1,2,3,4]],[[1,2,3,4,5,6],[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4]],[[1,2,3,4],[1,2,3,4]]])
for list in a:
    for sublist in list:
        del sublist[-1]

正在使用

print(a) 

给出以下数组:

[[[1, 2, 3, 4, 5, 6], [1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]] [[1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4], [1, 2, 3, 4]] [[1, 2, 3, 4], [1, 2, 3, 4]]
 [[1, 2, 3, 4], [1, 2, 3, 4]] [[1, 2, 3, 4], [1, 2, 3, 4]]]

正在使用

print(list)

for 循环后给出:

[[1, 2, 3, 4, 5], [1, 2, 3], [1, 2, 3]]
[[1, 2, 3, 4, 5], [1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3]]
[[1, 2, 3], [1, 2, 3]]

不幸的是,在我的阵列上使用它会出现以下错误:

TypeError: 'numpy.float64' object does not support item deletion

谢谢


更新: 我正在从网格 NetCDF 文件中提取我的信息。我已将 list 一词更改为 l,因为 list 是一个 Python 关键字。这对我来说并没有改变。

这为我的数组提供了一个很好的例子:

c = np.arange(5400).reshape(30,180)
for l in c:
    for i in l:
        del i[-1]

当我 运行 此代码时,出现以下错误:

Traceback (most recent call last):   File "main.py", line 18, in <module>
    del i[-1] 
 TypeError: 'numpy.int64' object does not support item deletion

del i[-1]是一个列表操作。 np.array 不支持。

Count the occurrences of a specific value and remove them at the same time 演示列表和数组在删除方面的区别。

你的例子a是对象数据类型,包含列表

In [111]: a.shape
Out[111]: (11,)
In [112]: [len(i) for i in a]
Out[112]: [3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2]
In [113]: a[0]
Out[113]: [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4], [1, 2, 3, 4]]

a[0] 是一个 3 元素列表,具有不同长度的子列表。

不清楚您要删除的内容。从 a 中删除元素,或从 a 的每个元素中删除元素,或从这些元素的子列表中删除元素。

此外,如果真实数据来自NetCDF,它实际上可能是一个多维数组。或者如果是对象 dtype,元素本身可能是 (2d) 数组。

以防万一,切片是从数组中删除 rows/columns 的正确方法:

In [114]: a = np.arange(12).reshape(3,4)
In [115]: a
Out[115]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [116]: a[:-1, :-1]
Out[116]: 
array([[0, 1, 2],
       [4, 5, 6]])

结果是view;它不会改变 a 本身。 a = a[:-1, :-1].copy() 是在不保留任何原始数组的情况下创建缩小数组的最简洁方法。