我有一个包含列表的复杂嵌套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]])
]])
由于您的数组包含不同大小和嵌套深度的列表,我怀疑是否有简单或快速的解决方案。
这是一种"完成工作无关紧要"的方法。它有两种口味。一个为叶子创建数组,另一个列出。
>>> 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)
如果列数是固定的,则
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) 形状数组,但仍然可以使用一维列表元素的对象 dtype。