繁体   English   中英

将多维numpy数组的元素转换为float32

[英]Convert elements of multi-dimensional numpy array to float32

我有一个复杂的嵌套 numpy 数组,其中包含列表。 我正在尝试将元素转换为 float32。 但是,它给了我以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-225-22d2824961c2> in <module>
----> 1 x_train_single.astype(np.float32)

ValueError: setting an array element with a sequence.

这是代码和示例输入:

    x_train_single.astype(np.float32)

    array([[ list([[[0, 0, 0, 0, 0, 0]], [-1.0], [0]]),
    list([[[0, 0, 0, 0, 0, 0], [173, 8, 172, 0, 0, 0]], [-1.0], [0]])
   ]])

如果列数是固定的,那么

np.array([l.astype(np.float) for l in x_train_single.squeeze()])

但它会删除冗余维度,将所有内容转换为 numpy 数组。

之前:(1、1、1、11、6)

之后:(11,6)

尝试这个:

np.array(x_train_single.tolist())   

看起来你有一个 (1,1) 形状的数组,其中单个元素是一个列表。 并且子列表的大小一致。

我希望你会得到一个形状为 (1, 1, 1, 11, 6) 和 int dtype 的数组。

或者:

np.array(x_train_single[0,0])

这再次从数组中提取列表,然后从中创建一个数组。

到目前为止,我的回答是基于显示的:

array([[list([[[173, 8, 172, 0, 0, 0], [512, 58, 57, 0, 0, 0],  
     ...: [513, 514, 0, 0, 0, 0], [515, 189, 516, 0, 0, 0], [309, 266, 0, 0, 0, 
     ...: 0],  
     ...: [32, 310, 0, 0, 0, 0], [271, 58, 517, 0, 0, 0], [164, 40, 0, 0, 0, 0],
     ...:  [38, 32, 60, 0, 0, 0], [38, 83, 60, 0, 0, 0], [149, 311, 0, 0, 0, 0]]
     ...: ])]])

新显示器更复杂

array([[ list([[[0, 0, 0, 0, 0, 0]], [-1.0], [0]]), 
     ...:     list([[[0, 0, 0, 0, 0, 0], [173, 8, 172, 0, 0, 0]], [-1.0], [0]])]])                                                                

因为内部列表的大小不同。 不能将其制成数字 dtype 数组。

它可以变成 (1,2,3) 形状数组,但仍然是具有 1d 列表元素的 object dtype。

由于您的数组包含不同大小和嵌套深度的列表,我怀疑是否有简单或快速的解决方案。

这是一种“无论做什么都完成工作”的方法。 它有两种口味。 一个为叶子创建 arrays,另一个列出。

>>> a
array([[list([[[0, 0, 0, 0, 0, 0]], [-1.0], [0]]),
        list([[[0, 0, 0, 0, 0, 0], [173, 8, 172, 0, 0, 0]], [-1.0], [0]])]],
      dtype=object)

>>> def mkarr(a):
...     try:
...         return np.array(a,np.float32)
...     except:
...         return [*map(mkarr,a)]
... 
>>> def mklst(a):
...     try:
...         return [*map(mklst,a)]
...     except:
...         return np.float32(a)
... 

>>> np.frompyfunc(mkarr,1,1)(a)
array([[list([array([[0., 0., 0., 0., 0., 0.]], dtype=float32), array([-1.], dtype=float32), array([0.], dtype=float32)]),
        list([array([[  0.,   0.,   0.,   0.,   0.,   0.],
       [173.,   8., 172.,   0.,   0.,   0.]], dtype=float32), array([-1.], dtype=float32), array([0.], dtype=float32)])]],
      dtype=object)

>>> np.frompyfunc(mklst,1,1)(a)
array([[list([[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]], [-1.0], [0.0]]),
        list([[[0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [173.0, 8.0, 172.0, 0.0, 0.0, 0.0]], [-1.0], [0.0]])]],
      dtype=object)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM