为什么将 python 列表转换为 Numpy 数组时仅在特定情况下才会出现此错误?

问题描述 投票:0回答:1

我有一个有点特殊的 python 列表列表结构,我需要将其转换为 numpy 数组,到目前为止,我已经成功地通过使用 np.array(myarray, dtype = object) 来简单地获得,但是对myarray 的结构导致我收到错误。

我已经设法将我的问题减少为两行代码,以下是我之前使用的代码,并且完全按照我想要的方式工作:

import numpy as np
myarray = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16],[17,18]])]
np.array(myarray,dtype = object)

但是,只需删除我们拥有的最后一个 [17,18] 数组

import numpy as np
myarray = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16]])]
np.array(myarray,dtype = object)

当它尝试运行第二行时,会出现“ValueError:无法将输入数组从形状 (2,4) 广播到形状 (2,)”。

在我看来,只有当数组长度相同但底层列表长度不同时才会发生这种情况,我不明白的是为什么设置 dtype = object 不涵盖这一点,特别是考虑到它处理更复杂的列表列表形状。

python numpy numpy-ndarray array-broadcasting
1个回答
0
投票

np.array
首先尝试创建一个 n 维数字数组 - 所有元素都是数字,并且形状在所有维度上都是一致的。 即没有“参差不齐”的数组。

在[36]中:alist = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16],[17,18]])]

In [38]: [a.shape for a in alist]
Out[38]: [(2, 4), (2, 2), (3, 2)]

alist
可以制作一个 3 元素数组。

您的问题案例:

In [39]: blist = [np.array([[1,2,3,4],[5,6,7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16]])]

In [40]: [a.shape for a in blist]
Out[40]: [(2, 4), (2, 2), (2, 2)]

请注意,所有子数组都具有相同的第一维。 这就是问题所在。

制作此类数组的安全方法是从正确形状的“虚拟”开始,然后填充它:

In [41]: res = np.empty(3,object); res[:] = blist; res
Out[41]: 
array([array([[1, 2, 3, 4],
              [5, 6, 7, 8]]), array([[ 9, 10],
                                     [11, 12]]), array([[13, 14],
                                                        [15, 16]])],
      dtype=object)

In [42]: res = np.empty(3,object); res[:] = alist; res
Out[42]: 
array([array([[1, 2, 3, 4],
              [5, 6, 7, 8]]), array([[ 9, 10],
                                     [11, 12]]), array([[13, 14],
                                                        [15, 16],
                                                        [17, 18]])],
      dtype=object)

当所有子数组/列表具有相同形状时它也适用

In [43]: clist = [np.array([[1,2],[7,8]]), np.array([[9,10],[11,12]]), np.array([[13,14],[15,16]])]

In [44]: res = np.empty(3,object); res[:] = clist; res
Out[44]: 
array([array([[1, 2],
              [7, 8]]), array([[ 9, 10],
                               [11, 12]]), array([[13, 14],
                                                  [15, 16]])],
      dtype=object)

没有它

clist
会产生一个 (3,2,2) 数字对象数组:

In [45]: np.array(clist, object)
Out[45]: 
array([[[1, 2],
        [7, 8]],

       [[9, 10],
        [11, 12]],

       [[13, 14],
        [15, 16]]], dtype=object)

一种思考方式,

np.array
并没有为您提供指定对象数组的“深度”或“形状”的方法。 它必须“猜测”,并且在某些情况下猜测是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.