关于python:numpy数组指定一个默认值

numpy array specify a default

我有一个要转换为numpy数组的python列表。我已经为numpy数组定义了数据类型。某些数组值可能为"无"或""。如果numpy数组的相应数据类型值为float或int,则会对这些值发出错误。如果该值为none或"",是否可以说numpy为特定数据类型分配1(或字段指定值)。

例如:下面的代码给出了错误

ValueError:无法将字符串转换为float。

1
2
3
4
5
6
7
8
9
    import re
    import numpy as np
    dt = np.dtype([ ('a', np.int32,),
          ('b', np.float32),
          ('c', np.int32,),
          ('d', np.float32),
          ('e', np.int32,),
      ])
     npar = np.array(('667000', '0', '0', '', ''), dt)

NPAR的预期输出为:(为d指定0.0,为e指定1作为默认值)

1
    (667000, 0.0, 0, 0.0, 1)

我有很多多维数组要转换。所以性能是需要考虑的重要因素。


numpy.lib.npyio.loadtxt函数有一个converters选项。

让data2.txt为:

1
2
667000;0;0;;;
668000;0;0;3;6;

u=loadtxt('data2.txt',dtype=dt,delimiter=';',converters={3: lambda s :float32(s or 0),4: lambda s :int32(s or 1)}),u之后:

1
array([(667000, 0.0, 0, 0.0, 1), (668000, 0.0, 0, 3.0, 6)], dtype=...)

替换缺少的值。


这可能有效:

One liner:

1
2
s = ('667000', '0', '0', '', '')
npar = np.array(tuple([0 if dt.names[x]== 'd' else 1 if dt.names[x]=='e' else s[x] for x in range(0,len(s))]),dt)

Or号:

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
dt = np.dtype([ ('a', np.int32,),
          ('b', np.float32),
          ('c', np.int32,),
          ('d', np.float32),
          ('e', np.int32,),
])
s = ('667000', '0', '0', '', '')
t = np.array(s)
if not t[4]:
    t[4] = 1
t[t==''] = 0
npar = np.array(tuple(t),dt)