I have the following numpy array
import numpy as np
X = np.array([[5.], [4.], [3.], [2.], [1.]])
I want to insert [6.] at the beginning.
I've tried:
X = X.insert(X, 0)
how do I insert into X?
numpy has an insert function that's accesible via np.insert with documentation.
You'll want to use it in this case like so:
X = np.insert(X, 0, 6., axis=0)
the first argument X specifies the object to be inserted into.
The second argument 0 specifies where.
The third argument 6. specifies what is to be inserted.
The fourth argument axis=0 specifies that the insertion should happen at position 0 for every column. We could've chosen rows but your X is a columns vector, so I figured we'd stay consistent.
I just wrote some code that does this operation ~100,000 times, so I needed to figure out the fastest way to do this. I'm not an expert in code efficiency by any means, but I could figure some things out by using the %%timeit magic function in a jupyter notebook.
My findings:
np.concatenate(([number],array))
requires the least time. Let's call it 1x time.
np.asarray([number] + list(array))
comes in at ~2x.
np.r_[number,array]
is ~4x.
np.insert(array,0,number)
appears to be the worst option here at 8x.
I have no idea how this changes with the size of array (I used a shape (15,) array) and most of the options I suggested only work if you want to put the number at the beginning. However, since that's what the question is asking about, I figure this is a good place to make these comparisons.
aa =np.concatenate(([0]*99, aa)) ... as I was manipulating a signal prior to smoothing, then finding the peaks.An addition to the comment of jbf81tb, as of 2023, all variants but the one with conversion to list, are more or less equal:
arr = np.random.rand(1000000)
%timeit np.concatenate(([-1],arr))
1.33 ms ± 23.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
arr = np.random.rand(1000000)
%timeit np.asarray([-1] + list(arr))
63.7 ms ± 691 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
arr = np.random.rand(1000000)
%timeit np.r_[-1,arr]
1.41 ms ± 35.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
arr = np.random.rand(1000000)
%timeit np.insert(arr,0,-1)
1.39 ms ± 24.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
I know this is a fairly old one, but a short solution is using numpy slicing tricks:
np.r_[[[6.]], X]
If you need to do it in a second dimension you can use np.c_.
I think this is the least cluttered version I can think of