Типы ответов
Типы признаков
Обобщающая способность
Задачи анализа данных
import numpy as np
X = np.array([1, 2, 3, 4])
print X.shape
X = np.array([[1, 2, 3, 4]])
print X.shape
X = np.array([ [[1, 2],
[3, 4]],
[[1, 2],
[3, 4]],
[[1, 2],
[3, 4]] ])
print X.shape
(4,) (1, 4) (3, 2, 2)
A = np.arange(15)
A
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
A = np.arange(15).reshape(3, 5)
A
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
Пустой массив, массив без инициализации
X = np.array([])
X.shape
(0,)
X = np.array([]).reshape(2, 2)
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-27-6a2129fececd> in <module>() ----> 1 X = np.array([]).reshape(5, 5) ValueError: total size of new array must be unchanged
X = np.empty((2, 2))
X
array([[ 4.94065646e-324, 9.88131292e-324], [ 1.48219694e-323, 1.97626258e-323]])
A.T
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
B = np.arange(6).reshape(2, 3)
B
array([[0, 1, 2], [3, 4, 5]])
Конкатенация:
np.concatenate((A.T, B), axis=0)
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14], [ 0, 1, 2], [ 3, 4, 5]])
np.concatenate((A, B.T), axis=1)
array([[ 0, 1, 2, 3, 4, 0, 3], [ 5, 6, 7, 8, 9, 1, 4], [10, 11, 12, 13, 14, 2, 5]])
В чем разница между concatenate и vstack/hstack? Stackoverflow!
Изменение размера матрицы (количество элементов должно оставаться тем же)
np.arange(6).reshape(2, 3)
array([[0, 1, 2], [3, 4, 5]])
Если задать один один из параметров равным -1, то он будет вычислен автоматически
np.arange(6).reshape(2, -1)
array([[0, 1, 2], [3, 4, 5]])
Вытягивание в вектор
np.ravel(A)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
np.ravel(A, order='F')
array([ 0, 5, 10, 1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14])
?np.ravel
A = np.arange(10).reshape(2, 5)
A
array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
Применить одно условие достаточно просто
A[A > 4]
array([5, 6, 7, 8, 9])
Если нужно сделать несколько условий?
A[A > 4 and A < 6]
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-44-2852d2c8b339> in <module>() ----> 1 A[A > 4 and A < 6] ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
A[np.logical_and(A > 4, A < 8)]
array([5])
Чтобы найти все ненулевые элементы матрицы:
A.nonzero()
(array([0, 0, 0, 0, 1, 1, 1, 1, 1]), array([1, 2, 3, 4, 0, 1, 2, 3, 4]))
A[A.nonzero()]
array([1, 2, 3, 4, 5])
A[A.nonzero()] = 10
A
array([[ 0, 10, 10, 10, 10], [10, 10, 10, 10, 10]])
A = np.arange(10).reshape(2, 5)
B = np.arange(9, -1, -1).reshape(2, 5) # на заметку slicing через аргументы: start = 9, stop=-1, step=-1
B
array([[9, 8, 7, 6, 5], [4, 3, 2, 1, 0]])
np.where(A>B, A, B)
array([[9, 8, 7, 6, 5], [5, 6, 7, 8, 9]])
Использование для индексации
ind = np.where(A>5)
A[ind[0], ind[1]]
array([6, 7, 8, 9])
A[ind[0], ind[1]] = -3
A
array([[ 0, 1, 2, 3, 4], [ 5, -3, -3, -3, -3]])
Ещё один тип данных в NumPy — matrix. Является производным классом от ndarray, в связи с чем можно использовать все методы и функции, применимые к array. Однако:
A = np.arange(0, 4).reshape(2, 2)
B = np.arange(3, 7).reshape(2, 2)
A * B
array([[ 0, 4], [10, 18]])
a = np.matrix(A)
b = np.matrix(B)
a * b
matrix([[ 5, 6], [21, 26]])
Зачем нам нужен NumPy, если есть вложенные списки/кортежи и циклы?
Причина заключается в скорости работы:
import time
Примечание: нет необходимости пользоваться модулем random, все есть в numpy.random
A_quick_arr = np.random.normal(size = (100000,))
B_quick_arr = np.random.normal(size = (100000,))
A_slow_list, B_slow_list = list(A_quick_arr), B_quick_arr.tolist()
N_repeat = 100
start = time.clock()
for i in range(N_repeat):
ans = 0
for i in range(100000):
ans += A_slow_list[i] * B_slow_list[i]
print (time.clock() - start) / N_repeat # время выполнения в секундах
0.0429953
start = time.clock()
for i in range(N_repeat):
ans = sum([A_slow_list[i] * B_slow_list[i] for i in range(100000)])
print (time.clock() - start)/ N_repeat
0.03926768
start = time.clock()
for i in range(N_repeat):
ans = np.sum(A_quick_arr * B_quick_arr)
print (time.clock() - start)/ N_repeat
0.0005213