我的目标是将我的数据转换为numpy数组,同时保留原始列表中的数字格式,清晰明确。
例如,这是我的列表格式数据:
[[24.589888563639835, 13.899891781550952, 4478597, -1], [26.822224204095697, 14.670531752529088, 4644503, -1], [51.450405486761866, 54.770422572665254, 5570870, 0], [44.979065080591504, 54.998835550128852, 6500333, 0], [44.866399274880663, 55.757240813761534, 6513301, 0], [45.535380533604247, 57.790074517001365, 6593281, 0], [44.850372630818214, 54.720574554485822, 6605483, 0], [51.32738085400576, 55.118344981379266, 6641841, 0]]
当我将它转换为numpy数组时,
data = np.asarray(data)
我得到数学符号e
,如何在输出数组中保留相同的格式?
[[ 2.45898886e+01 1.38998918e+01 4.47859700e+06 -1.00000000e+00]
[ 2.68222242e+01 1.46705318e+01 4.64450300e+06 -1.00000000e+00]
[ 5.14504055e+01 5.47704226e+01 5.57087000e+06 0.00000000e+00]
[ 4.49790651e+01 5.49988356e+01 6.50033300e+06 0.00000000e+00]
[ 4.48663993e+01 5.57572408e+01 6.51330100e+06 0.00000000e+00]
[ 4.55353805e+01 5.77900745e+01 6.59328100e+06 0.00000000e+00]
[ 4.48503726e+01 5.47205746e+01 6.60548300e+06 0.00000000e+00]
[ 5.13273809e+01 5.51183450e+01 6.64184100e+06 0.00000000e+00]]
我做了:
np.set_printoptions(precision=6,suppress=True)
但是当我将一部分数据传递给另一个变量然后查看其中时,我仍然得到不同的数字,我看到小数已经改变了!为什么它在内部更改小数,为什么它只是按原样保持它们?
答案 0 :(得分:1)
从嵌套列表创建简单数组:
In [133]: data = np.array(alist)
In [136]: data.shape
Out[136]: (8, 4)
In [137]: data.dtype
Out[137]: dtype('float64')
这是一个2d数组,8'行',4'列';所有元素都存储为float。
可以将列表加载到结构化数组中,该数组被定义为具有浮点和整数字段的混合。请注意,我必须将'rows'转换为此负载的元组。
In [139]: dt = np.dtype('f,f,i,i')
In [140]: dt
Out[140]: dtype([('f0', '<f4'), ('f1', '<f4'), ('f2', '<i4'), ('f3', '<i4')])
In [141]: data = np.array([tuple(row) for row in alist], dtype=dt)
In [142]: data.shape
Out[142]: (8,)
In [143]: data
Out[143]:
array([( 24.58988762, 13.89989185, 4478597, -1),
( 26.82222366, 14.67053223, 4644503, -1),
( 51.45040512, 54.77042389, 5570870, 0),
( 44.97906494, 54.99883652, 6500333, 0),
( 44.86639786, 55.7572403 , 6513301, 0),
( 45.53538132, 57.79007339, 6593281, 0),
( 44.85037231, 54.72057343, 6605483, 0),
( 51.32738113, 55.11834335, 6641841, 0)],
dtype=[('f0', '<f4'), ('f1', '<f4'), ('f2', '<i4'), ('f3', '<i4')])
您可以按名称访问字段,而不是列号:
In [144]: data['f0']
Out[144]:
array([ 24.58988762, 26.82222366, 51.45040512, 44.97906494,
44.86639786, 45.53538132, 44.85037231, 51.32738113], dtype=float32)
In [145]: data['f3']
Out[145]: array([-1, -1, 0, 0, 0, 0, 0, 0], dtype=int32)
将这些值与2d float数组中单列的显示进行比较:
In [146]: dataf = np.array(alist)
In [147]: dataf[:,0]
Out[147]:
array([ 24.58988856, 26.8222242 , 51.45040549, 44.97906508,
44.86639927, 45.53538053, 44.85037263, 51.32738085])
In [148]: dataf[:,3]
Out[148]: array([-1., -1., 0., 0., 0., 0., 0., 0.])
当浮点数,整数,字符串或其他dtypes混合使用时,结构化数组的使用更有意义。
但要稍微补充一下 - 纯浮动版本出了什么问题?为什么保留2列的整数标识很重要?