Issue
I have a 2D NumPy array. I want to slice out unequal length subsets of columns and put them in a single array with the rest of the values being filled by nan
. That is to say in:
data = np.random.normal(size=(100,4))
I want to index from [75, 33, 42, 54]
to end. That is to say row index from 75 to the end in column 0, row 33 to the end in column 1 and so on.
I tried data[[slice(75,100),slice(33,100)],:]
but it didn't work.
Solution
To get repeatable results, I seeded the random generator:
np.random.seed(0)
and then created the source array:
data = np.random.normal(size=(100,4))
The list of starting indices I defined as:
ind = [75, 33, 42, 54]
An initial step is to compute the max length of the output column:
ml = max([ 100 - i for i in ind ])
Then you can generate the output array as:
result = np.array([ np.pad(data[rInd:, i[0]], (0, ml - 100 + rInd),
constant_values = np.nan) for i, rInd in np.ndenumerate(ind) ]).T
This code:
- takes the required slice of the source array (data[rInd:, i[0]]),
- pads it with the requered number of NaN values,
- creates a Numpy array (so far each row contains what the target column should contain),
- so the only remaining step is to transpose this array.
The result, for my source data, is:
array([[-1.30652685, 0.03183056, 0.92085882, -0.04225715],
[ 0.66638308, -0.20829876, -1.03424284, 0.48148147],
[ 0.69377315, 0.4393917 , -0.4555325 , 0.23218104],
[-1.12682581, 0.94447949, -0.6436184 , -0.49331988],
[-0.04217145, -0.4615846 , -1.10438334, 0.7811981 ],
[-0.71960439, -0.82643854, -1.29285691, 0.67690804],
[-1.15735526, -1.07993151, 0.52327666, -0.29779088],
[-0.70470028, 1.92953205, 2.16323595, 1.07961859],
[ 0.77325298, 0.84436298, 1.0996596 , -0.57578797],
[-1.75589058, 0.31694261, -0.02432612, 0.69474914],
[ 1.0685094 , -0.65102559, 0.91017891, 0.61037938],
[-0.44092263, -0.68954978, -0.94444626, -0.0525673 ],
[ 0.5785215 , -1.37495129, 2.25930895, 0.08842209],
[ 1.36453185, -1.60205766, -0.46359597, -2.77259276],
[-1.84306955, 1.5430146 , 0.15650654, -0.39095338],
[ 0.69845715, -1.1680935 , -1.42406091, 2.06449286],
[-0.01568211, 0.82350415, -1.15618243, 1.53637705],
[-0.26773354, -0.23937918, 0.42625873, 1.21114529],
[ 0.84163126, -1.61695604, -0.13288058, -0.48102712],
[ 0.64331447, -0.09815039, 1.15233156, 1.13689136],
[-1.69810582, -0.4664191 , 0.52106488, 0.37005589],
[ 0.03863055, 0.37915174, 0.69153875, -0.6801782 ],
[ 1.64813493, -0.34598178, -1.5829384 , -1.34671751],
[-0.35343175, 0.06326199, -0.59631404, 1.07774381],
[ 0.85792392, -0.23792173, 0.52389102, 0.09435159],
[ nan, 0.41605005, 0.39904635, -0.10730528],
[ nan, -2.06998503, -0.65240858, -0.89091508],
[ nan, -0.39727181, -2.03068447, 2.2567235 ],
[ nan, -1.67600381, -0.69204985, -1.18894496],
[ nan, -1.46642433, -1.04525337, 0.60631952],
[ nan, -0.31932842, -0.62808756, 1.6595508 ],
[ nan, -1.38336396, -0.1359497 , -1.2140774 ],
[ nan, -0.50681635, -0.39944903, 0.15670386],
[ nan, 0.1887786 , -0.11816405, -1.43779147],
[ nan, 0.09740017, -1.33425847, -0.52118931],
[ nan, 0.39009332, -0.13370156, 0.6203583 ],
[ nan, -0.11610394, -0.38487981, 0.33996498],
[ nan, 1.02017271, -0.0616264 , -0.39484951],
[ nan, 0.60884383, 0.27451636, -0.99312361],
[ nan, 1.30184623, -0.15766702, 0.49383678],
[ nan, -1.06001582, 0.74718833, 0.88017891],
[ nan, 0.58295368, -2.65917224, -1.02250684],
[ nan, 1.65813068, -0.6840109 , -1.47183501],
[ nan, -0.46071979, -0.68783761, -0.2226751 ],
[ nan, -0.15957344, -0.36469354, -0.76149221],
[ nan, -0.73067775, -0.76414392, 0.85255194],
[ nan, -0.28688719, -0.6522936 , nan],
[ nan, -0.81299299, -0.47965581, nan],
[ nan, -0.31229225, 0.93184837, nan],
[ nan, 0.94326072, -0.19065349, nan],
[ nan, -1.18388064, 0.28044171, nan],
[ nan, 0.45093446, 0.04949498, nan],
[ nan, -0.4533858 , -0.20690368, nan],
[ nan, -0.2803555 , -2.25556423, nan],
[ nan, 0.34965446, -0.98551074, nan],
[ nan, -0.68944918, 0.56729028, nan],
[ nan, -0.477974 , -0.29183736, nan],
[ nan, 0.00377089, 1.46657872, nan],
[ nan, 0.16092817, nan, nan],
[ nan, -1.12801133, nan, nan],
[ nan, -0.24945858, nan, nan],
[ nan, -1.57062341, nan, nan],
[ nan, 0.38728048, nan, nan],
[ nan, -1.6567151 , nan, nan],
[ nan, 0.16422776, nan, nan],
[ nan, -1.61647419, nan, nan],
[ nan, 1.14110187, nan, nan]])
Note that the above code contains i[0], because np.ndenumerate returns as the first result a tuple of indices.
Since data is a 1-D array, we are interested in the first index only, so after i I put [0].
Answered By - Valdi_Bo
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.