Reputation: 6538
Imagine we have a 5x4 matrix. We need to remove only the first dimension. How can we do it with numpy?
array([[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[ 12., 13., 14., 15.],
[ 16., 17., 18., 19.]], dtype=float32)
I tried:
arr = np.arange(20, dtype=np.float32)
matrix = arr.reshape(5, 4)
new_arr = numpy.delete(matrix, matrix[:,0])
trimmed_matrix = new_arr.reshape(5, 3)
It looks a bit clunky. Am I doing it correctly? If yes, is there a cleaner way to remove the dimension without reshaping?
Upvotes: 20
Views: 93328
Reputation: 7806
If you want to remove a column from a 2D Numpy array you can specify the columns like this
to keep all rows and to get rid of column 0 (or start at column 1 through the end)
a[:,1:]
another way you can specify the columns you want to keep ( and change the order if you wish) This keeps all rows and only uses columns 0,2,3
a[:,[0,2,3]]
The documentation on this can be found here
And if you want something which specifically removes columns you can do something like this:
idxs = list.range(4)
idxs.pop(2) #this removes elements from the list
a[:, idxs]
and @hpaulj brought up numpy.delete()
This would be how to return a view of 'a' with 2 columns removed (0 and 2) along axis=1.
np.delete(a,[0,2],1)
This doesn't actually remove the items from 'a', it's return value is a new numpy array.
Upvotes: 57
Reputation: 231395
The correct way to use delete
is to specify index and dimension, eg. remove the 1st (0) column (dimension 1):
In [215]: np.delete(np.arange(20).reshape(5,4),0,1)
Out[215]:
array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11],
[13, 14, 15],
[17, 18, 19]])
other expressions that work:
np.arange(20).reshape(5,4)[:,1:]
np.arange(20).reshape(5,4)[:,[1,2,3]]
np.arange(20).reshape(5,4)[:,np.array([False,True,True,True])]
Upvotes: 9