You can use an array with dtype = object :
>>> arr = np.ndarray((10,4),dtype = object) >>> arr[:,0] = int(10) >>> arr[:,1:] = float(10) >>> arr array([[10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0], [10, 10.0, 10.0, 10.0]], dtype=object)
Note that when doing arithmetic you get the correct behavior.
>>> arr / 3 array([[3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333], [3, 3.33333333333, 3.33333333333, 3.33333333333]], dtype=object)
Or you can use numpy.recarray :
>>> import numpy as np >>> arr = np.recarray(10,dtype=[('x',int),('y',float,4)]) >>> arr[:] = 0 >>> arr rec.array([(0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.])), (0, array([ 0., 0., 0., 0.]))], dtype=[('x', '<i4'), ('y', '<f8', (4,))]) >>> arr['x'] array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) >>> arr['y'] array([[ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.], [ 0., 0., 0., 0.]])
If you need to perform arithmetic in all values, you will have to perform the operation on each field separately, for example.
>>> arr['x'] += 2 >>> arr['y'] += 2