我有一个列表,如
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阵列的ndarray(数组(A,A,A,...))。
不幸的是,我无法从值错误消息中获得线索。有趣的是,如果我只用C.T
转换矩阵C(使其成为3x2矩阵),则不会抛出错误。
现在,我可以通过事先创建list_A,list_B,list_C(而不是list_ABC)来解决问题,但这并不是那么简单(构建和附加到每个list_A / B / C需要更多行码)。类似地,我可以使用其他方法(例如,使用包含所有A / B / C矩阵列表的A,B,C键的dict),但没有像这个解决方案那样简单。
抛出错误的工作示例:
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)
非常感谢!
答案 0 :(得分:1)
从数组构造数组时,np.array
函数可以做三件事:
如果所有子阵列具有相同的形状,则会生成更高维度的数组
如果子阵列的形状不同,则可以构造对象dtype数组。这就像一个列表或嵌套列表,但具有索引和重塑数组的能力
引发错误。当行匹配但列不匹配时,这似乎最常发生。它可能太晚检测到形状不匹配,无法回到对象dtype解决方案上。
更多相关内容:
How to keep numpy from broadcasting when creating an object array of different shaped arrays
要获得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.]]])