Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Operation on numpy arrays contain rows with different size

I have two lists, looking like this:

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]]

which I want to subtract from each other element by element for an Output like this:

a-b= [[-4,-4,-4,-4],[7,2,2,2],[-1,-1,-1,-1,-1]]

In order to do so I convert each of a and b to arrays and subtract them I use:

np.array(a)-np.array(b)

The Output just gives me the error:

Unsupported Operand type for-: 'list' and 'list'

What am I doing wrong? Shouldn't the np.array command ensure the conversion to the array?

like image 670
umpalumpa__ Avatar asked Aug 11 '16 10:08

umpalumpa__


3 Answers

Here is a Numpythonic way:

>>> 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)]
>>> 

Since you cannot subtract the arrays with different shapes, you can flatten your arrays using np.hstack() then subtract your flattened arrays then reshape based on the previous shape.

like image 196
Mazdak Avatar answered Nov 13 '22 20:11

Mazdak


You can try:

>>> 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]]

Or 2nd method is using map:

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]]
like image 27
Harsha Biyani Avatar answered Nov 13 '22 20:11

Harsha Biyani


The dimensions of your two arrays don't match, i.e. the first two sublists of a have 4 elements, but the third has 5 and ditto with b. If you convert the lists to numpy arrays, numpy silently gives you something like this:

In [346]: aa = np.array(a)
In [347]: bb = np.array(b)
In [348]: aa
Out[348]: array([[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6, 7]], dtype=object)
In [349]: bb
Out[349]: array([[5, 6, 7, 8], [9, 1, 2, 3], [4, 5, 6, 7, 8]], dtype=object)

You need to make sure that all your sublists have the same number of elements, then your code will work:

In [350]: a = [[1,2,3,4], [2,3,4,5],[3,4,5,6]]; b = [[5,6,7,8], [9,1,2,3], [4,5,6,7]] # I removed the last element of third sublist in a and b
In [351]: np.array(a) - np.array(b)
Out[351]: 
array([[-4, -4, -4, -4],
       [-7,  2,  2,  2],
       [-1, -1, -1, -1]])
like image 1
tttthomasssss Avatar answered Nov 13 '22 20:11

tttthomasssss