Search code examples
pythonnumpyconcatenationnan

numpy concatenation along axis is not working with generated arrays


when we concatenate along axis with 1d array and 2d array, we can produce concatenated arrays like this.

a = np.c_[np.array([10,12]),[np.array([1,2,3]),np.array([2,3,4])]]

array([[10,  1,  2,  3],
       [12,  2,  3,  4]])

I am trying to do same thing with generated 2d nan array with given 1d array.Somehow concatenation is not working.I think issue with when generating the nan arrays.What is the reason for this?

tmp = np.array([280, 362, 236, 239, 336, 347, 238, 327, 369, 238, 324, 264, 280,
       284, 347, 265, 303, 276, 261, 274, 353, 260, 280, 240, 312, 239,
       314, 319, 238, 324, 322, 238, 226, 294, 280, 276, 306, 265, 203,
       292, 261, 265, 284, 260, 184, 294, 312, 226, 284, 319, 238, 281,
       322, 180, 284, 294, 253, 282, 306, 194, 282, 292, 246, 279, 284,
       205])

tmp2 = np.array([7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7,
       7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7,
       6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 6])

nans = [ np.ones(i)*np.nan for i in tmp2]
concat = np.c_[tmp,nans]

output

array([[280, array([nan, nan, nan, nan, nan, nan, nan])],
       [362, array([nan, nan, nan, nan, nan, nan, nan])],
       [236, array([nan, nan, nan, nan, nan, nan])],
       [239, array([nan, nan, nan, nan, nan, nan, nan])],
       [336, array([nan, nan, nan, nan, nan, nan, nan])],
       [347, array([nan, nan, nan, nan, nan, nan])],
       ....

expected output

array([[280,nan, nan, nan, nan, nan, nan, nan],
       [362,nan, nan, nan, nan, nan, nan, nan],
       [236,nan, nan, nan, nan, nan, nan],
       [239,nan, nan, nan, nan, nan, nan, nan]
           ....
        ])

Solution

  • The reason why your code failed is that Numpy does not support "jagged" arrays (with varying number of elements in each row).

    You can add as many NaN columns as you wish (the same number in each row), executing:

    n = 5  # How many NaN columns to add
    tmp = np.array([280, 362, 236, 239])
    result = np.c_[tmp, np.full((tmp.size, n), np.nan)]
    

    The result is:

    array([[280.,  nan,  nan,  nan,  nan,  nan],
           [362.,  nan,  nan,  nan,  nan,  nan],
           [236.,  nan,  nan,  nan,  nan,  nan],
           [239.,  nan,  nan,  nan,  nan,  nan]])