如何(简单地)构建一个整数和浮动混合numpy数组

glu*_*uke 6 python numpy multidimensional-array

我只想创建一个大小(N,m)的numpy数组,它只有第一列由整数组成,其余的默认为float.所以,如果初始化为零,它应该是结果:

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.]])
Run Code Online (Sandbox Code Playgroud)

在尝试创建这样的结构化数组时,我所做的所有尝试都返回了一些元组子元素.

Joh*_*ard 16

你可以使用一个数组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)
Run Code Online (Sandbox Code Playgroud)

请注意,在进行算术运算时会得到正确的行为.

>>> 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)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用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.]])
Run Code Online (Sandbox Code Playgroud)

如果您需要对所有值进行算术运算,则必须单独对每个字段执行操作,例如

>>> arr['x'] += 2
>>> arr['y'] += 2
Run Code Online (Sandbox Code Playgroud)