Chris Zhou
Chris Zhou

Reputation: 55

remove empty numpy array

I have a numpy array:

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

How can I remove this array in a multidimensional array? I tried

import numpy as np

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

But, the multidimensional array still has this empty array.

EDIT: The input is

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

The expected output after removing the empty arrays is:

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

Upvotes: 4

Views: 9577

Answers (3)

Rodolfo Souza
Rodolfo Souza

Reputation: 41

I had initially an array (3,11,11) and after a multprocessing using pool.map my array was transformed in a list like this:

[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],...

if a convert this list in an array the shape was (3,), so I used:

myarray = np.vstack(mylist)

and this returned my first 3d array with the original shape (3,11,11).

Upvotes: 1

hpaulj
hpaulj

Reputation: 231665

new_array, as printed, looks like a list of arrays. And even if it were an array, it would be a 1d array of dtype=object.

==[] is not the way to check for an empty array:

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

Check the syntax for np.delete. It requires an array, an index and an axis, and returns another array. It does not operate in place.

If new_array is a list, a list comprehension would do a nice job of removing the [] arrays:

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

It would also work if new_array was a 1d array:

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

To use np.delete with new_array, you have to specify which elements:

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)

to find [0,3] you could use np.where:

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

Better yet, skip the delete and where and go with a boolean mask

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

I don't think there's a way of identifying these 'emtpy' arrays without a list comprehension, since you have to check the shape or size property, not the element's data. Also there's a limit as to what kinds of math you can do across elements of an object array. It's more like a list than a 2d array.

Upvotes: 4

jgloves
jgloves

Reputation: 719

Delete takes the multidimensional array as a parameter. Then you need to specify the subarray to delete and the axis it's on. See 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)

Also, note that the deletion is not in-place.

Upvotes: 0

Related Questions