numpy数组上的操作包含不同大小的行

ump*_*a__ 8 python arrays numpy

我有两个列表,看起来像这样:

a= [[1,2,3,4], [2,3,4,5],[3,4,5,6,7]], b= [[5,6,7,8], [9,1,2,3], [4,5,6,7,8]]
Run Code Online (Sandbox Code Playgroud)

我想逐个元素地逐个减去输出,如下所示:

a-b= [[-4,-4,-4,-4],[7,2,2,2],[-1,-1,-1,-1,-1]]
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,我将每个a和转换b为数组并减去我使用的:

np.array(a)-np.array(b)
Run Code Online (Sandbox Code Playgroud)

输出只是给我错误:

不支持的操作数类型 - :'list'和'list'

我究竟做错了什么?np.array命令不应该确保转换到数组吗?

Kas*_*mvd 5

这是一种Numpythonic方式:

>>> y = map(len, a)  
>>> a = np.hstack(np.array(a))
>>> b = np.hstack(np.array(b))
>>> np.split(a-b, np.cumsum(y))
[array([-4, -4, -4, -4]), array([-7,  2,  2,  2]), array([-1, -1, -1, -1, -1]), array([], dtype=float64)]
>>> 
Run Code Online (Sandbox Code Playgroud)

由于您无法减去具有不同形状的阵列,因此可以使用np.hstack()平面阵列缩小阵列,然后根据以前的形状重新整形.


Har*_*ani 1

你可以试试:

>>> a= [[1,2,3,4], [2,3,4,5],[3,4,5,6,7]]
>>> b= [[5,6,7,8], [9,1,2,3], [4,5,6,7,8]]
>>> 
>>> c =[]
>>> for i in range(len(a)):
    c.append([A - B for A, B in zip(a[i], b[i])])


>>> print c
[[-4, -4, -4, -4], [-7, 2, 2, 2], [-1, -1, -1, -1, -1]]
Run Code Online (Sandbox Code Playgroud)

或者第二种方法是使用地图

from operator import sub
a= [[1,2,3,4], [2,3,4,5],[3,4,5,6,7]]
b= [[5,6,7,8], [9,1,2,3], [4,5,6,7,8]]
c =[]
for i in range(len(a)):
    c.append(map(sub, a[i], b[i]))  
print c
[[-4, -4, -4, -4], [-7, 2, 2, 2], [-1, -1, -1, -1, -1]]
Run Code Online (Sandbox Code Playgroud)