繁体   English   中英

numpy广播形状错误:将list(list(arrays))转换为array

[英]Numpy broadcast shape error: convert list( lists(arrays) ) to array

我有一个列表列表,例如list_ABC = [[A,B,C], [A,B,C], ...]
2D ndarrays A(2x2),B(2x3)和C(2x3)。

现在,我想将主列表转换为numpy数组:

np.array(list_ABC)

但是,出现以下错误:

ValueError: could not broadcast input array from shape (2,2) into shape (2)

我需要这种转换,因为我想得到

A_matrices = np.array(list_ABC)[:, 0]
B_matrices = np.array(list_ABC)[:, 1]

这样我最终可以获得包含所有A数组(array(A,A,A,...))的ndarray。

不幸的是,我无法从值错误消息中获得线索。 有趣的是,如果我仅用CT转置矩阵C(使其成为3x2矩阵),则不会引发任何错误。

现在,我可以通过预先创建一个list_A,list_B,list_C(而不是list_ABC)来解决此问题,但这并不那么简单(构造和附加到每个list_A / B / C需要更多代码行)。 类似地,我可以使用其他方法(例如,使用包含所有A / B / C矩阵列表的A,B,C键的字典),但是没有什么比这个解决方案更简单了。

抛出错误的工作示例:

import numpy as np
list = [[np.array([[ 476.,  667.], [ 474.,  502.]]), np.array([[ 343.,  351.,  449.], [ 352.,  332.,  292.]]), np.array([[ 328.,  328.,  294.], [ 367.,  355.,  447.]])], [np.array([[ 497.,  546.], [ 456.,  517.]]), np.array([[ 361.,  342.,  340.], [ 341.,  304.,  328.]]), np.array([[ 347.,  313.,  293.], [ 355.,  333.,  375.]])]]
np.array(list)

非常感谢!

从数组构造数组时, np.array函数可以做三件事:

  • 如果所有子数组都具有相同的形状,它将构成一个更高维的数组

  • 如果子数组的形状不同,则可以构造对象dtype数组。 这就像一个列表或嵌套列表,但是能够像数组一样索引和重塑形状

  • 引发错误。 当行匹配而列不匹配时,这似乎最常发生。 可能检测形状不匹配的时间太晚而无法退回到对象dtype解决方案上。

有关更多信息,请访问:

创建不同形状的数组的对象数组时,如何防止numpy广播


为了获得array(A,A,A,...)我建议使用列表理解。 构造对象dtype数组太棘手了。


创建对象数组的可靠方法是初始化一个空数组并填充它:

In [116]: arr = np.empty((2,3), dtype=object)
In [117]: arr[...] = alist
In [118]: arr
Out[118]: 
array([[array([[ 476.,  667.],
       [ 474.,  502.]]),
        array([[ 343.,  351.,  449.],
       [ 352.,  332.,  292.]]),
        array([[ 328.,  328.,  294.],
       [ 367.,  355.,  447.]])],
       [array([[ 497.,  546.],
       [ 456.,  517.]]),
        array([[ 361.,  342.,  340.],
       [ 341.,  304.,  328.]]),
        array([[ 347.,  313.,  293.],
       [ 355.,  333.,  375.]])]], dtype=object)

现在,我可以选择“ A”元素:

In [119]: arr[:,0]
Out[119]: 
array([array([[ 476.,  667.],
       [ 474.,  502.]]),
       array([[ 497.,  546.],
       [ 456.,  517.]])], dtype=object)

但这是一个对象数组,再次包装在np.array中不会改变这一点:

In [120]: np.array(arr[:,0])
Out[120]: 
array([array([[ 476.,  667.],
       [ 474.,  502.]]),
       array([[ 497.,  546.],
       [ 456.,  517.]])], dtype=object)

但是它们可以在多个不同的轴上串联。

In [121]: np.stack(arr[:,0])
Out[121]: 
array([[[ 476.,  667.],
        [ 474.,  502.]],

       [[ 497.,  546.],
        [ 456.,  517.]]])

但是我不需要对象数组就可以得到相同的结果

In [123]: np.stack([a[0] for a in alist])
Out[123]: 
array([[[ 476.,  667.],
        [ 474.,  502.]],

       [[ 497.,  546.],
        [ 456.,  517.]]])

暂无
暂无

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

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