Условия и булевы массивы, размерность матрицы / np 5

До этого момента индексы и срезы использовать для извлечения подмножеств. В этих методах используются числовые значения. Но есть альтернативный путь получения элементов — с помощью условий и булевых операторов.

Предположим, что нужно выбрать все значения меньше 0,5 в матрице размером 4х4, которая содержит случайные значения между 0 и 1.

>>> A = np.random.random((4, 4))
>>> A
array([[ 0.03536295, 0.0035115 , 0.54742404, 0.68960999],
       [ 0.21264709, 0.17121982, 0.81090212, 0.43408927],
       [ 0.77116263, 0.04523647, 0.84632378, 0.54450749],
       [ 0.86964585, 0.6470581 , 0.42582897, 0.22286282]])

Когда матрица из случайных значений определена, можно применить оператор условия. Результатом будет матрица из булевых значений: True, если элемент соответствовал условию и False — если нет. В этом примере можно видеть все элементы со значениями меньше 0,5.

>>> A < 0.5
array([[ True, True, False, False],
       [ True, True, False, True],
       [False, True, False, False],
       [False, False, True, True]], dtype=bool)

На самом деле, булевы массивы используются для неявного извлечения частей массивов. Добавив прошлое условие в квадратные скобки, можно получить новый массив, который будет включать все элементы меньше 0,5 из предыдущего.

>>> A[A < 0.5]
array([ 0.03536295, 0.0035115 , 0.21264709, 0.17121982, 0.43408927,
        0.04523647, 0.42582897, 0.22286282])

Управление размерностью

Вы уже видели, как можно превращать одномерный массив в матрицу с помощью функции reshape().

>>> a = np.random.random(12)
>>> a
array([ 0.77841574, 0.39654203, 0.38188665, 0.26704305, 0.27519705,
        0.78115866, 0.96019214, 0.59328414, 0.52008642, 0.10862692,
        0.41894881, 0.73581471])
>>> A = a.reshape(3, 4)
>>> A
array([[ 0.77841574, 0.39654203, 0.38188665, 0.26704305],
       [ 0.27519705, 0.78115866, 0.96019214, 0.59328414],
       [ 0.52008642, 0.10862692, 0.41894881, 0.73581471]])

Функция reshape() возвращает новый массив и таким образом может создавать новые объекты. Но если необходимо изменить объект, поменяв его форму, нужно присвоить кортеж с новыми размерностями атрибуту shape массива.

>>> a.shape = (3, 4)
>>> a
array([[ 0.77841574, 0.39654203, 0.38188665, 0.26704305],
       [ 0.27519705, 0.78115866, 0.96019214, 0.59328414],
       [ 0.52008642, 0.10862692, 0.41894881, 0.73581471]])

Как видно на примере, в этот раз оригинальный массив изменил форму, и ничего не возвращается. Обратная операция также возможна. Можно конвертировать двухмерный массив в одномерный с помощью функции ravel().

>>> a = a.ravel()
array([ 0.77841574, 0.39654203, 0.38188665, 0.26704305, 0.27519705,
        0.78115866, 0.96019214, 0.59328414, 0.52008642, 0.10862692,
        0.41894881, 0.73581471])

Или прямо повлиять на атрибут shape самого массива.

>>> a.shape = (12)
>>> a
array([ 0.77841574, 0.39654203, 0.38188665, 0.26704305, 0.27519705,
        0.78115866, 0.96019214, 0.59328414, 0.52008642, 0.10862692,
        0.41894881, 0.73581471])

Еще одна важная операция — транспонирование матрицы. Это инверсия колонок и рядов. NumPy предоставляет такую функциональность в функции transpose().

>>> A.transpose()
array([[ 0.77841574, 0.27519705, 0.52008642],
       [ 0.39654203, 0.78115866, 0.10862692],
       [ 0.38188665, 0.96019214, 0.41894881],
       [ 0.26704305, 0.59328414, 0.73581471]])