You can also use sets:
a = numpy.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
the_index_list = [2, 3, 6]
the_big_set = set(numpy.arange(len(a)))
the_small_set = set(the_index_list)
the_delta_row_list = list(the_big_set - the_small_set)
a = a[the_delta_row_list]
There is a numpy built-in function to help with that.
import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([3,4,7])
>>> c = np.setdiff1d(a,b)
>>> c
array([1, 2, 5, 6, 8, 9])
list comprehension could be an interesting approach as well.
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = np.array([2, 3, 6]) #index is changed to an array.
out = [val for i, val in enumerate(a) if all(i != index)]
>>> [1, 2, 5, 6, 8, 9]
To delete by value :
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
Remove specific index(i removed 16 and 21 from matrix)
import numpy as np
mat = np.arange(12,26)
a = [4,9]
del_map = np.delete(mat, a)
del_map.reshape(3,4)
Output:
array([[12, 13, 14, 15],
[17, 18, 19, 20],
[22, 23, 24, 25]])
Not being a numpy person, I took a shot with:
>>> import numpy as np
>>> import itertools
>>>
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> index=[2,3,6]
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))
>>> a
array([1, 2, 5, 6, 8, 9])
According to my tests, this outperforms numpy.delete()
. I don't know why that would be the case, maybe due to the small size of the initial array?
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
100000 loops, best of 3: 12.9 usec per loop
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)"
10000 loops, best of 3: 108 usec per loop
That's a pretty significant difference (in the opposite direction to what I was expecting), anyone have any idea why this would be the case?
Even more weirdly, passing numpy.delete()
a list performs worse than looping through the list and giving it single indices.
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)"
10000 loops, best of 3: 33.8 usec per loop
Edit: It does appear to be to do with the size of the array. With large arrays, numpy.delete()
is significantly faster.
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
10 loops, best of 3: 200 msec per loop
python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)"
1000 loops, best of 3: 1.68 msec per loop
Obviously, this is all pretty irrelevant, as you should always go for clarity and avoid reinventing the wheel, but I found it a little interesting, so I thought I'd leave it here.
Using np.delete
is the fastest way to do it, if we know the indices of the elements that we want to remove. However, for completeness, let me add another way of "removing" array elements using a boolean mask created with the help of np.isin
. This method allows us to remove the elements by specifying them directly or by their indices:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Remove by indices:
indices_to_remove = [2, 3, 6]
a = a[~np.isin(np.arange(a.size), indices_to_remove)]
Remove by elements (don't forget to recreate the original a
since it was rewritten in the previous line):
elements_to_remove = a[indices_to_remove] # [3, 4, 7]
a = a[~np.isin(a, elements_to_remove)]
If you don't know the index, you can't use logical_and
x = 10*np.random.randn(1,100)
low = 5
high = 27
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]
In case you don't have the indices of the elements you want to remove, you can use the function in1d provided by numpy.
The function returns True
if the element of a 1-D array is also present in a second array. To delete the elements, you just have to negate the values returned by this function.
Notice that this method keeps the order from the original array.
In [1]: import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
rm = np.array([3, 4, 7])
# np.in1d return true if the element of `a` is in `rm`
idx = np.in1d(a, rm)
idx
Out[1]: array([False, False, True, True, False, False, True, False, False])
In [2]: # Since we want the opposite of what `in1d` gives us,
# you just have to negate the returned value
a[~idx]
Out[2]: array([1, 2, 5, 6, 8, 9])
A Numpy array is immutable, meaning you technically cannot delete an item from it. However, you can construct a new array without the values you don't want, like this:
b = np.delete(a, [2,3,6])
Source: Stackoverflow.com