Python 删除空的numpy数组
我有一个numpy阵列:Python 删除空的numpy数组,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy阵列: array([], shape=(0, 4), dtype=float64) 如何在多维数组中删除此数组? 我试过了 但是,多维数组仍然有这个空数组 编辑: 输入是 new_array = [array([], shape=(0, 4), dtype=float64), array([[-0.97, 0.99, -0.98, -0.93 ], [-0.97, -0.99, 0.59, -0.93 ], [-0.97, 0.99, -0.98,
array([], shape=(0, 4), dtype=float64)
如何在多维数组中删除此数组?
我试过了
但是,多维数组仍然有这个空数组
编辑:
输入是
new_array = [array([], shape=(0, 4), dtype=float64),
array([[-0.97, 0.99, -0.98, -0.93 ],
[-0.97, -0.99, 0.59, -0.93 ],
[-0.97, 0.99, -0.98, -0.93 ],
[ 0.70 , 1, 0.60, 0.65]]), array([[-0.82, 1, 0.61, -0.63],
[ 0.92, -1, 0.77, 0.88],
[ 0.92, -1, 0.77, 0.88],
[ 0.65, -1, 0.73, 0.85]]), array([], shape=(0, 4), dtype=float64)]
删除空阵列后的预期输出为:
new array = [array([[-0.97, 0.99, -0.98, -0.93 ],
[-0.97, -0.99, 0.59, -0.93 ],
[-0.97, 0.99, -0.98, -0.93 ],
[ 0.70 , 1, 0.60, 0.65]]),
array([[-0.82, 1, 0.61, -0.63],
[ 0.92, -1, 0.77, 0.88],
[ 0.92, -1, 0.77, 0.88],
[ 0.65, -1, 0.73, 0.85]])]
Delete将多维数组作为参数。然后需要指定要删除的子阵列及其所在的轴。看
np.delete(新数组,0)
另外,请注意,删除未到位。
new\u array
,如打印的,看起来像一个数组列表。即使它是一个数组,它也是一个dtype=object的1d数组
=[]
不是检查空数组的方法:
In [10]: x=np.zeros((0,4),float)
In [11]: x
Out[11]: array([], shape=(0, 4), dtype=float64)
In [12]: x==[]
Out[12]: False
In [14]: 0 in x.shape # check if there's a 0 in the shape
Out[14]: True
检查np的语法。删除。它需要一个数组、一个索引和一个轴,并返回另一个数组。它没有在适当的地方运行
如果new\u array
是一个列表,那么列表理解可以很好地删除[]
数组:
In [33]: alist=[x, np.ones((2,3)), np.zeros((1,4)),x]
In [34]: alist
Out[34]:
[array([], shape=(0, 4), dtype=float64), array([[ 1., 1., 1.],
[ 1., 1., 1.]]), array([[ 0., 0., 0., 0.]]), array([], shape=(0, 4), dtype=float64)]
In [35]: [y for y in alist if 0 not in y.shape]
Out[35]:
[array([[ 1., 1., 1.],
[ 1., 1., 1.]]), array([[ 0., 0., 0., 0.]])]
如果new_array
是1d数组,它也可以工作:
new_array=np.array(alist)
newer_array = np.array([y for y in new_array if 0 not in y.shape])
要将np.delete
与new_array
一起使用,必须指定以下元素:
In [47]: np.delete(new_array,[0,3])
Out[47]:
array([array([[ 1., 1., 1.],
[ 1., 1., 1.]]),
array([[ 0., 0., 0., 0.]])], dtype=object)
要查找[0,3]
,可以使用np.where
:
np.delete(new_array,np.where([y.size==0 for y in new_array]))
更好的方法是跳过删除
和where
并使用布尔掩码
new_array[np.array([y.size>0 for y in new_array])]
我认为在没有列表理解的情况下,没有办法识别这些“emtpy”数组,因为您必须检查shape或size属性,而不是元素的数据。此外,对于可以跨对象数组的元素执行的数学类型也有限制。它更像是一个列表,而不是一个2d数组。我最初有一个数组(3,11,11),在使用pool.map进行多处理后,我的数组被转换成如下列表:
[array([], shape=(0, 11, 11), dtype=float64),
array([[[ 0.35318114, 0.36152024, 0.35572945, 0.34495254, 0.34169853,
0.36553977, 0.34266126, 0.3492261 , 0.3339431 , 0.34759375,
0.33490712],...
如果在数组中转换此列表,则形状为(3,),因此我使用:
myarray = np.vstack(mylist)
这就返回了我的第一个3d阵列的原始形状(3,11,11) 在numpy.array
中没有shape
关键字,该数组是什么函数?我刚刚打印了我用new\u array.append(array)构建的新的\u数组。这就是打印输出。@AnandSKumar:这是一个NumPyndarray
。当无法推断形状
和数据类型
时(例如,当存在零长度标注时,如此处所示),它们将包含在repr
中<例如,code>np.zero((0,4),dtype=float)
会有这样一个repr
。我更喜欢x.size==0
而不是0 in x.shape
:它看起来更直接。有趣。。。这让我想到了“空名单”的拍摄…>>>x=np.asanyarray([],dtype='float64')>>>y=a.reformate((0,4,4))>>print(\nx:{!r:}形状:{!r:}\ny:{!r:})。format(x,x.shape,y))如果尝试将第一个和最后一个数组与中间数组合并,只要重新塑造从空列表派生的原始数组的形状以匹配中间数组的形状,就只能得到中间数组。我找不到讨论组合大小为0的数组的文档,我知道如果形状不同,您就找不到。np.concatenate([np.one((2,4)),np.zero((0,4))
有效地删除了(0,4)
数组。只要其他维度匹配,concatenate
对0
维度没有问题。
[array([], shape=(0, 11, 11), dtype=float64),
array([[[ 0.35318114, 0.36152024, 0.35572945, 0.34495254, 0.34169853,
0.36553977, 0.34266126, 0.3492261 , 0.3339431 , 0.34759375,
0.33490712],...
myarray = np.vstack(mylist)