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

时间:2017-04-12 14:00:54

标签: python arrays numpy for-loop del

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

为了说明我想要实现的目标,我在Python中使用and array和嵌套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

1 个答案:

答案 0 :(得分: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,它实际上可能是一个多维数组。或者如果对象为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()是创建缩小大小的数组而不留下任何原始数组的最干净的方法。