Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove an 2d array subset?

I have a 800x800 array and I want to analize just the elements in the outter part of it. I need a new array without the elements of the slice [5:-5,5:-5]. It doesn't necessarily have to return a 2d array, a flat array or a list will do as well. Example:

import numpy

>>> a = numpy.arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a.shape = (3,3)
array([[1, 2, 3],
   [4, 5, 6],
   [7, 8, 9]])

I need to discard the core elements, something like:

del a[1:2,1:2]

I expect to have:

array([1, 2, 3, 4, 6, 7, 8, 9])

I tried to use numpy.delete() but it seems to work for one axis at a time. I wonder if there is a more straight forward way to do this.

like image 460
user1470350 Avatar asked Jun 20 '12 20:06

user1470350


People also ask

Can you delete from a 2D array?

To delete a row or column in a 2D array, right-click the array row or column and select Data Operations»Delete Row or Delete Column. You also can programmatically delete elements, rows, columns, and pages within arrays.

How do you clear a 2D array?

To delete a 2D ordinary array, just let it go out of scope. If the 2D array is in free store, then it must be deleted with the delete[] operator to free memory in the scope in which it is declared.

How do I remove a specific element from a list in Python 2D?

Python pop() method The pop() method removes an element from the list based on the index given.


2 Answers

You can use a boolean array to index your array any way you like. That way you don't have to change any values in your original array if you don't want to. Here is a simple example:

>>> import numpy as np
>>> a = np.arange(1,10).reshape(3,3)
>>> b = a.astype(bool)
>>> b[1:2,1:2] = False
>>> b
array([[ True,  True,  True],
       [ True, False,  True],
       [ True,  True,  True]], dtype=bool)
>>> a[b]
array([1, 2, 3, 4, 6, 7, 8, 9])
like image 176
fraxel Avatar answered Oct 11 '22 08:10

fraxel


You can replace the middle region with some placeholder value (I used -12345, anything that can't occur in your actual data would work), then select everything that is not equal to that value:

>>> import numpy as np
>>> a = np.arange(1,26)
>>> a.shape = (5,5)
>>> a
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])

>>> a[1:4,1:4] = -12345
>>> a
array([[     1,      2,      3,      4,      5],
       [     6, -12345, -12345, -12345,     10],
       [    11, -12345, -12345, -12345,     15],
       [    16, -12345, -12345, -12345,     20],
       [    21,     22,     23,     24,     25]])
>>> a[a != -12345]
array([ 1,  2,  3,  4,  5,  6, 10, 11, 15, 16, 20, 21, 22, 23, 24, 25])

If you use a float array rather than an integer array, you can do it a little more elegantly by using NaN and isfinite:

>>> a = np.arange(1,26).astype('float32')
>>> a.shape = (5,5)
>>> a[1:4,1:4] = np.nan
>>> a
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,  nan,  nan,  nan,  10.],
       [ 11.,  nan,  nan,  nan,  15.],
       [ 16.,  nan,  nan,  nan,  20.],
       [ 21.,  22.,  23.,  24.,  25.]], dtype=float32)
>>> a[np.isfinite(a)]
array([  1.,   2.,   3.,   4.,   5.,   6.,  10.,  11.,  15.,  16.,  20.,
    21.,  22.,  23.,  24.,  25.], dtype=float32)
like image 30
Junuxx Avatar answered Oct 11 '22 08:10

Junuxx