Concatenating empty array in Numpy
if you know the number of columns before hand:
>>> xs = np.array([[1,2,3,4,5],[10,20,30,40,50]])>>> ys = np.array([], dtype=np.int64).reshape(0,5)>>> ysarray([], shape=(0, 5), dtype=int64)>>> np.vstack([ys, xs])array([[ 1., 2., 3., 4., 5.], [ 10., 20., 30., 40., 50.]])
if not:
>>> ys = np.array([])>>> ys = np.vstack([ys, xs]) if ys.size else xsarray([[ 1, 2, 3, 4, 5], [10, 20, 30, 40, 50]])
Something that I've build to deal with this sort of problem. It's also deals with list
input instead of np.array
:
import numpy as npdef cat(tupleOfArrays, axis=0): # deals with problems of concating empty arrays # also gives better error massages # first check that the input is correct assert isinstance(tupleOfArrays, tuple), 'first var should be tuple of arrays' firstFlag = True res = np.array([]) # run over each element in tuple for i in range(len(tupleOfArrays)): x = tupleOfArrays[i] if len(x) > 0: # if an empty array\list - skip if isinstance(x, list): # all should be ndarray x = np.array(x) if x.ndim == 1: # easier to concat 2d arrays x = x.reshape((1, -1)) if firstFlag: # for the first non empty array, just swich the empty res array with it res = x firstFlag = False else: # actual concatination # first check that concat dims are good if axis == 0: assert res.shape[1] == x.shape[1], "Error concating vertically element index " + str(i) + \ " with prior elements: given mat shapes are " + \ str(res.shape) + " & " + str(x.shape) else: # axis == 1: assert res.shape[0] == x.shape[0], "Error concating horizontally element index " + str(i) + \ " with prior elements: given mat shapes are " + \ str(res.shape) + " & " + str(x.shape) res = np.concatenate((res, x), axis=axis) return resif __name__ == "__main__": print(cat((np.array([]), []))) print(cat((np.array([1, 2, 3]), np.array([]), [1, 3, 54+1j]), axis=0)) print(cat((np.array([[1, 2, 3]]).T, np.array([]), np.array([[1, 3, 54+1j]]).T), axis=1)) print(cat((np.array([[1, 2, 3]]).T, np.array([]), np.array([[3, 54]]).T), axis=1)) # a bad one