Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is going on behind this numpy selection behavior?

Answering this question, some others and I were actually wrong by considering that the following would work:

Say one has

test = [ [ [0], 1 ],
         [ [1], 1 ]
       ]
import numpy as np
nptest = np.array(test)

What is the reason behind

>>> nptest[:,0]==[1]
array([False, False], dtype=bool)

while one has

>>> nptest[0,0]==[1],nptest[1,0]==[1]
(False, True)


or
>>> nptest==[1]
array([[False,  True],
       [False,  True]], dtype=bool)

or

>>> nptest==1
array([[False,  True],
       [False,  True]], dtype=bool)

Is it the degeneracy in term of dimensions which causes this.

like image 558
keepAlive Avatar asked Jul 31 '17 23:07

keepAlive


1 Answers

nptest is a 2D array of object dtype, and the first element of each row is a list.

nptest[:, 0] is a 1D array of object dtype, each of whose elements are lists.

When you do nptest[:,0]==[1], NumPy does not perform an elementwise comparison of each element of nptest[:,0] against the list [1]. It creates as high-dimensional an array as it can from [1], producing the 1D array np.array([1]), and then broadcasts the comparison, comparing each element of nptest[:,0] against the integer 1.

Since no list in nptest[:, 0] is equal to 1, all elements of the result are False.

like image 187
user2357112 supports Monica Avatar answered Nov 06 '22 00:11

user2357112 supports Monica