删除空的numpy数组

时间:2015-06-23 17:50:45

标签: python arrays numpy

我有一个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]])]

3 个答案:

答案 0 :(得分:2)

打印时,

new_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.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是1d数组,它也会起作用:

new_array=np.array(alist)
newer_array = np.array([y for y in new_array if 0 not in y.shape])

要将np.deletenew_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]))

更好的是,跳过deletewhere并使用布尔掩码

new_array[np.array([y.size>0 for y in new_array])]

我认为没有一种方法可以在没有列表推导的情况下识别这些'emtpy'数组,因为你必须检查形状或大小属性,而不是元素的数据。还有一个限制,你可以跨对象数组的元素做什么样的数学运算。它更像是一个列表,而不是一个二维数组。

答案 1 :(得分:1)

我最初有一个数组(3,11,11),在使用pool.map进行多处理之后,我的数组被转换成这样的列表:

'use strict';
 $scope.posts = posts.posts;

 $scope.search = function (row) {
    return (angular.lowercase(row.author).indexOf($scope.query || '') !== -1 ||
    angular.lowercase(row.title).indexOf($scope.query || '') !== -1 ||
    angular.lowercase(row.content).indexOf($scope.query || '') !== -1 ||
    angular.lowercase(row.date).indexOf($scope.query || '') !== -1 ||
 };

如果在数组中将此列表转换为形状为(3,),那么我使用:

[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,11,11)的3d数组。

答案 2 :(得分:0)

Delete将多维数组作为参数。然后,您需要指定要删除的子阵列及其所在的轴。见http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html

np.delete(new_array,<obj indicating subarray to delete (perhaps an array of integers in your case)>, 0)

另请注意,删除不是就地。