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

eni9jsuy  于 2023-06-23  发布在  其他
关注(0)|答案(4)|浏览(147)

所以我创建了一个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] ValueError:无法将输入数组从形状(2)广播到形状(3)
为什么我改不了?我该怎么做?

5n0oy7gb

5n0oy7gb1#

给出:

>>> 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的所有速度和其他优势。
如果你所说的“universal”是指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]])
83qze16e

83qze16e2#

>>> 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是矩阵(2D数组)。它有一定数量的行和列。在一个矩阵中,所有行的长度必须相同。因此,在上述示例中,如果第一行的长度为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操作执行bb的元素加法,但c+c执行两个列表之间的连接操作。

进一步参考

How to make a multidimension numpy array with a varying row size?

xkftehaa

xkftehaa3#

具体操作如下:

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]]
guykilcj

guykilcj4#

在列表理解的帮助下,这个问题很容易解决:[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]被执行,结果被添加到一个新的数组中。

相关问题