删除空的NumPy数组

4

我有一个numpy数组:

array([], shape=(0, 4), dtype=float64)

如何在多维数组中删除该数组?我尝试过

import numpy as np

if array == []:
    np.delete(array)

但是,多维数组仍然有这个空数组。

编辑: 输入为

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

1
numpy.array 中没有 shape 关键字,那个函数是什么数组? - Anand S Kumar
我刚刚打印了用new_array.append(array)构建的new_array数组。这就是打印的输出结果。 - Chris Zhou
1
@AnandSKumar:这是一个NumPy的ndarray。当无法推断出shapedtype时(例如当存在零长度维度时),它们会包含在repr中。例如,np.zeros((0, 4), dtype=float)将具有类似于此的repr - Mark Dickinson
3个回答

4

new_array,按照输出的形式看起来像一个数组列表。即使它是一个数组,也会是一个dtype=object的一维数组。

==[]不是检查空数组的方法:

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.delete的语法。它需要一个数组,一个索引和一个轴,并返回另一个数组。它不会就地操作。

如果new_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是一个一维数组,也可以工作:
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)

使用 np.where 可以找到 [0,3]

np.delete(new_array,np.where([y.size==0 for y in new_array]))

更好的做法是跳过 `delete` 和 `where` ,使用布尔蒙版。
new_array[np.array([y.size>0 for y in new_array])]

我认为没有一种方法可以在不使用列表推导的情况下识别这些“空”数组,因为你必须检查形状或大小属性,而不是元素的数据。此外,有一个限制,即您可以对对象数组的元素执行哪些类型的数学运算。它更像是一个列表而不是2d数组。


我更喜欢使用 x.size == 0 而不是 0 in x.shape:因为前者更加直接。 - Mark Dickinson
有趣...这让我想到了“空列表”。看看下面的代码:
x = np.asanyarray( [] , dtype='float64') y = a.reshape((0,4,4)) print("\nx: {!r:} shape:{!r:}\ny: {!r:}".format(x,x.shape,y))
如果你试图将第一个和最后一个数组与中间的数组合并,只要你将从空列表派生的原始数组重新塑造成与中间数组相匹配的形状,你最终只会得到中间数组。我找不到任何关于组合大小为0的数组的文档,我知道如果形状不同就无法组合。
- user1121588
np.concatenate([np.ones((2,4)),np.zeros((0,4))]) 可以有效地移除 (0,4) 数组。只要其他维度匹配,concatenate 对于 0 维度没有问题。 - hpaulj

1

我最初有一个数组(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)

这样就返回了我的第一个三维数组,保留了原始形状(3,11,11)。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接