我正在尝试删除numpy.ndarray
(type = 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
答案 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()
是创建缩小大小的数组而不留下任何原始数组的最干净的方法。