Niki
Niki

Reputation: 55

What Is the Function of Less Than (<) Operator in numpy Array?

I'm learning Python right now and I'm stuck with this line of code I found on the internet. I can not understand what actually this line of code do.

Suppose I have this array:

import numpy as np
x = np.array ([[1,5],[8,1],[10,0.5]]
y = x[np.sqrt(x[:,0]**2+x[:,1]**2) < 1]
print (y)

The result is an empty array. What I want to know is what does actually the y do? I've never encountered this kind of code before. It seems like the square brackets is like the if-conditional statement. Instead of that code, If write this line of code:

import numpy as np
x = np.array ([[1,5],[8,1],[10,0.5]]
y = x[0 < 1]
print (y)

It will return exactly what x is (because zero IS less than one).
Assuming that it is a way to write if-conditional statement, I find it really absurd because I'm comparing an array with an integer.
Thank you for your answer!

Upvotes: 3

Views: 4528

Answers (2)

Tarifazo
Tarifazo

Reputation: 4343

numpy works differently when you slice an array using a boolean or an int.

From the docs:

This advanced indexing occurs when obj is an array object of Boolean type, such as may be returned from comparison operators. A single boolean index array is practically identical to x[obj.nonzero()] where, as described above, obj.nonzero() returns a tuple (of length obj.ndim) of integer index arrays showing the True elements of obj. However, it is faster when obj.shape == x.shape.

If obj.ndim == x.ndim, x[obj] returns a 1-dimensional array filled with the elements of x corresponding to the True values of obj. The search order will be row-major, C-style. If obj has True values at entries that are outside of the bounds of x, then an index error will be raised. If obj is smaller than x it is identical to filling it with False.

When you index an array using booleans, you are telling numpy to select the data corresponding to True, therefore array[True] is not the same as array[1]. In the first case, numpy will therefore interpret it as a zero dimensional boolean array, which, based on how masks works, is the same as selecting all data.

Therefore:

x[True]

will return the full array, just as

x[False]

will return an empty array.

Upvotes: 1

jkm
jkm

Reputation: 704

In Numpy:

[1,1,2,3,4] < 2

is (very roughly) equivalent to something like:

[x<2 for x in [1,1,2,3,4]]

for vanilla Python lists. And as such, in both cases, the result would be:

[True, True, False, False, False]

The same holds true for some other functions, like addition, multiplication and so on. Broadcasting is actually a major selling point for Numpy.

Now, another thing you can do in Numpy is boolean indexing, which is providing an array of bools that are interpreted as 'Keep this value Y/N?'. So:

arr = [1,1,2,3,4]
res = arr[arr<2]

# evaluates to:
=> [1,1] 

Upvotes: 2

Related Questions