如何删除子数组的结束元素?



所以我创建了一个numpy数组:

import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])

我正在尝试删除此数组子数组的结束元素:

a[0] = (a[0])[:-1]

并遇到此问题:

a[0] = (a[0]([:-1] 值错误: 无法将输入数组从形状 (2( 广播到形状 (3(

为什么我不能改变它? 我该怎么做?

给定:

>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

你可以做:

>>> a[:,0:2]
array([[1, 2],
[4, 5],
[7, 8]])

或:

>>> np.delete(a,2,1)
array([[1, 2],
[4, 5],
[7, 8]])

然后,无论哪种情况,都将其分配回a因为结果是一个新数组。

所以:

>>> a=a[:,0:2]
>>> a
array([[1, 2],
[4, 5],
[7, 8]])

如果您只想删除第一行中的3,那就是另一个问题。只有当你有一个 python 列表数组时,你才能这样做,因为子列表的长度不同。

例:

>>> a = np.array([[1,2],[4,5,6],[7,8,9]])
>>> a
array([list([1, 2]), list([4, 5, 6]), list([7, 8, 9])], dtype=object)

如果你这样做,就坚持使用Python。您将失去Numpy的所有速度和其他优势。


如果"通用"是指 N x M 数组每行的最后一元素,只需使用.shape查找维度:

>>> a
array([[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12]])
>>> a.shape
(3, 4)
>>> np.delete(a,a.shape[1]-1,1)
array([[ 1,  2,  3],
[ 5,  6,  7],
[ 9, 10, 11]])

>>> a[:,0:a.shape[1]-1]
array([[ 1,  2,  3],
[ 5,  6,  7],
[ 9, 10, 11]])
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> type(a)
<class 'numpy.ndarray'>
>>> a.shape
(3, 3)

变量a是矩阵(二维数组(。它具有一定数量的行和列。在矩阵中,所有行的长度必须相同。因此,在上面的示例中,如果第一行的长度为 2,其他行的长度为 3,则无法形成矩阵。因此,仅删除第一个(或任何其他子集(子数组的最后一个元素是不可能的。

相反,您必须同时删除所有子数组的最后一个元素。

这可以作为

>>> a[:,0:2]
array([[1, 2],
[4, 5],
[7, 8]])

>>> np.delete(a,2,1)
array([[1, 2],
[4, 5],
[7, 8]])

这也适用于其他职位的要素。可以删除子数组的任何元素,请记住所有子数组的长度应相同。

但是,您可以操作任何子数组的最后一个元素(或任何其他元素(,除非形状保持不变。

>>> a[0][-1] = 19
>>> a
array([[ 1,  2, 19],
[ 4,  5,  6],
[ 7,  8,  9]])

如果您尝试使用不等长的行形成矩阵,则会形成一个列表的一维数组,在该数组上没有向量处理、切片等 Numpy 操作有效(列表操作有效(

>>> b = np.array([[1,2,3],[1,2,3]])
>>> c = np.array([[1,2],[1,2,3]])
>>> b
array([[1, 2, 3],
[1, 2, 3]])
>>> b.shape
(2, 3)
>>> c
array([list([1, 2]), list([1, 2, 3])], dtype=object)
>>> c.shape
(2,)
>>> print(type(b),type(c))
<class 'numpy.ndarray'> <class 'numpy.ndarray'>

两者都是 ndarray,但您可以看到c的第二个变量是列表的一维数组。

>>> b+b
array([[2, 4, 6],
[2, 4, 6]])
>>> c+c
array([list([1, 2, 1, 2]), list([1, 2, 3, 1, 2, 3])], dtype=object)

类似地,b+b操作执行b的元素加法与b,但c+c执行两个列表之间的串联操作。

如需进一步参考

如何制作具有不同行大小的多维 numpy 数组?

方法如下:

import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
a = a[:-1]
print(a)

输出:

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

在列表理解的帮助下很容易解决:[a[0:-1] for a in array]

例如,有输入数据:

输入:

array = [[1,2,3,4],[5,6,7],[8,9]]

print([a[0:-1] for a in array])

输出:

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

循环迭代发生:

for a in array

在每次迭代中,执行a[0:-1]并将结果添加到新数组中。

最新更新