所以我创建了一个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)为什么我改不了?我该怎么做?
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=a[:,0:2] >>> a array([[1, 2], [4, 5], [7, 8]])
如果您只想删除第一行中的3,则问题不同。只有当你有一个python列表数组时才能这样做,因为子列表的长度不一样。示例:
3
>>> 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来计算维度:
.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]])
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][-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的第二个变量是一个一维列表数组。
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执行两个列表之间的连接操作。
b+b
b
c+c
How to make a multidimension numpy array with a varying row size?
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]]
guykilcj4#
在列表理解的帮助下,这个问题很容易解决:[a[0:-1] for a in array]例如,有输入数据:输入:
[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]被执行,结果被添加到一个新的数组中。
a[0:-1]
4条答案
按热度按时间5n0oy7gb1#
给出:
您可以:
或者:
然后在任何一种情况下,将其赋值回
a
,因为结果是一个新数组。所以:
如果您只想删除第一行中的
3
,则问题不同。只有当你有一个python列表数组时才能这样做,因为子列表的长度不一样。示例:
如果你这样做,就坚持使用Python。你将失去Numpy的所有速度和其他优势。
如果你所说的“universal”是指N x M数组每一行的最后一个元素,那么只需使用
.shape
来计算维度:或者
83qze16e2#
变量
a
是矩阵(2D数组)。它有一定数量的行和列。在一个矩阵中,所有行的长度必须相同。因此,在上述示例中,如果第一行的长度为2而其它行的长度为3,则不能形成矩阵。因此,仅删除第一(或任何其他子集)子数组的最后一个元素是不可能的。相反,你必须同时删除所有子数组的最后一个元素。
这可以作为
或者
这也适用于其他职位的要素。可以对子阵列的任何元素进行删除,记住所有子阵列应该具有相同的长度。
但是,您可以操纵任何子数组的最后一个元素(或任何其他元素),除非形状保持不变。
如果你试图用不等长的行组成一个矩阵,则会形成一个一维列表数组,在该数组上没有Numpy操作,如向量处理,切片等。工作(列表操作工作)
两者都是ndarray,但是你可以看到
c
的第二个变量是一个一维列表数组。类似地,
b+b
操作执行b
与b
的元素加法,但c+c
执行两个列表之间的连接操作。进一步参考
How to make a multidimension numpy array with a varying row size?
xkftehaa3#
具体操作如下:
输出:
guykilcj4#
在列表理解的帮助下,这个问题很容易解决:
[a[0:-1] for a in array]
例如,有输入数据:
输入:
输出:
循环迭代发生:
在每次迭代中,
a[0:-1]
被执行,结果被添加到一个新的数组中。