【问题标题】:delete last item in all rows and columns numpy.ndarray删除所有行和列中的最后一项 numpy.ndarray
【发布时间】:2017-09-08 08:46:09
【问题描述】:

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

为了说明我想要实现的目标,我在 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' 对象不支持删除项目

谢谢


更新: 我正在从网格 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

【问题讨论】:

  • 它对我有用。不要使用关键字作为变量名。 list 是 Python 的关键字
  • 对于一个参差不齐的数组,你怎么会有行和列?
  • @VivekSable 见主帖更新
  • 在更新的示例中,您可以使用c = c[:-1, :-1]“删除”最后一列和最后一行。不过,我不明白您在另一个示例中想要什么,使用 dtype object 的数组。
  • 在您的第二个示例中,您的数组具有形状 (30,180)。当通过它循环两次时,你最终得到一个 int,而不是一个数组。所以调用 del i[-1] 是行不通的。

标签: python arrays numpy for-loop del


【解决方案1】:

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

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

您的示例 a 是对象 dtype,包含列表

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,它实际上可能是一个多维数组。或者如果 object dtype,元素本身可能是 (2d) 数组。

如果切片是从数组中删除行/列的正确方法:

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() 是在不留下任何原始数组的情况下创建缩减大小数组的最简洁方法。

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 2022-11-23
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    • 2013-11-12
    相关资源
    最近更新 更多