Какова функция оператора меньше чем (<) в массиве numpy? - PullRequest
0 голосов
/ 10 января 2019

Я сейчас изучаю Python и застрял в этой строке кода, которую нашел в интернете. Я не могу понять, что на самом деле делает эта строка кода.

Предположим, у меня есть этот массив:

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)

Результатом является пустой массив. Я хочу знать, что на самом деле делает y ? Я никогда не сталкивался с такого рода кодом раньше. Кажется, что квадратные скобки похожи на оператор if-conditional . Вместо этого кода, если напишите эту строку кода:

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

Он вернет именно то, что x (потому что ноль меньше единицы).
Предполагая, что это способ написать оператор if-conditional , я считаю его действительно абсурдным, потому что я сравниваю массив с целым числом.
Спасибо за ваш ответ!

Ответы [ 2 ]

0 голосов
/ 10 января 2019

numpy работает иначе, когда вы разрезаете массив, используя boolean или int.

Из документов :

Это расширенное индексирование происходит, когда obj является объектом массива логического типа, который может быть возвращен из операторов сравнения. Один массив логических индексов практически идентичен x [obj.nonzero ()] где, как описано выше, obj.nonzero () возвращает кортеж (длины) obj.ndim) массивов целочисленных индексов, показывающих истинные элементы obj. Тем не менее, это быстрее, когда obj.shape == x.shape.

Если obj.ndim == x.ndim, x [obj] возвращает заполненный одномерный массив с элементами x, соответствующими истинным значениям obj. порядок поиска будет основным, C-стиль. Если obj имеет значения True в записи, которые находятся за пределами х, то ошибка индекса будет быть поднятым. Если obj меньше x, то это идентично заполнению Ложные.

Когда вы индексируете массив, используя логические значения, вы говорите numpy, чтобы выбрать данные, соответствующие True, поэтому array[True] не совпадает с array[1]. В первом случае numpy будет интерпретировать его как логический массив нулевого измерения, который, в зависимости от того, как работает маска, идентичен выбору всех данных.

Таким образом:

x[True]

вернет полный массив, так же как

x[False]

вернет пустой массив.

0 голосов
/ 10 января 2019

В Numpy:

[1,1,2,3,4] <2 </p>

(очень приблизительно) эквивалентно чему-то вроде:

[x <2 для x in [1,1,2,3,4]] </p>

для ванильных списков Python. И как таковой, в обоих случаях результат будет:

[Истина, Правда, Ложь, Ложь, Ложь]

То же самое относится и к некоторым другим функциям, таким как сложение, умножение и так далее. Вещание на самом деле является основным пунктом продажи для Numpy.

Теперь, еще одна вещь, которую вы можете сделать в Numpy, это логическое индексирование, которое предоставляет массив bools, которые интерпретируются как «Keep this value Y / N?». Итак:

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

# evaluates to:
=> [1,1] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...