嵌套列表推导可以完成这项工作:
In [102]: [[i2-j2 for i2,j2 in zip(i1,j1)] for i1,j1 in zip(a,b)]
Out[102]: [[-4, -4, -4, -4], [-7, 2, 2, 2], [-1, -1, -1, -1, -1]]
np.array(a)-np.array(b) 的问题在于子列表的长度不同,因此生成的数组是对象类型 - 列表数组
In [104]: np.array(a)
Out[104]: array([[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6, 7]], dtype=object)
减法可以很好地迭代外部数组,但是在从另一个子列表中减去一个子列表时遇到问题 - 因此出现错误消息。
如果我将输入数组设为数组,则减法将起作用
In [106]: np.array([np.array(a1) for a1 in a])
Out[106]: array([array([1, 2, 3, 4]), array([2, 3, 4, 5]), array([3, 4, 5, 6, 7])], dtype=object)
In [107]: aa=np.array([np.array(a1) for a1 in a])
In [108]: bb=np.array([np.array(a1) for a1 in b])
In [109]: aa-bb
Out[109]:
array([array([-4, -4, -4, -4]),
array([-7, 2, 2, 2]),
array([-1, -1, -1, -1, -1])], dtype=object)
您无法计算对对象 dtype 数组起作用的数组操作。但在这种情况下,subtraction 是为子数组定义的,因此它可以处理嵌套。
另一种嵌套方法是使用np.subtract。这是- 的ufunc 版本,并将根据需要将np.asarray 应用于其输入:
In [103]: [np.subtract(i1,j1) for i1,j1 in zip(a,b)]
Out[103]: [array([-4, -4, -4, -4]), array([-7, 2, 2, 2]), array([-1, -1, -1, -1, -1])]
请注意,这些数组计算返回数组或数组列表。将内部数组转回列表需要迭代。
如果您从列表开始,转换为数组通常不会节省时间。数组计算可以更快,但这并不能弥补首先创建数组的开销。
如果我将输入填充为相等的长度,那么简单的数组减法就会起作用,创建一个二维数组。
In [116]: ao= [[1,2,3,4,0], [2,3,4,5,0],[3,4,5,6,7]]; bo= [[5,6,7,8,0], [9,1,2,3,0], [4,5,6,7,8]]
In [117]: np.array(ao)-np.array(bo)
Out[117]:
array([[-4, -4, -4, -4, 0],
[-7, 2, 2, 2, 0],
[-1, -1, -1, -1, -1]])