Если вы создаете 1d-массив в Python, есть ли какая-либо польза от использования пакета NumPy?
Python.array против numpy.array
Ответ 1
Все зависит от того, что вы планируете делать с массивом. Если все, что вы делаете, - это создание массивов простых типов данных и ввод/вывод, модуль массива будет работать нормально.
Если, с другой стороны, вы хотите выполнить какой-либо численный расчет, модуль массива не поможет с этим. NumPy (и SciPy) предоставляют вам широкий спектр операций между массивами и специальными функциями, которые полезны не только для научной работы, но и для таких вещей, как расширенные манипуляции с изображениями или вообще все, что вам необходимо для выполнения эффективных вычислений с большими объемами данных.
Numpy также гораздо более гибок, например, он поддерживает массивы любых типов объектов Python, а также способен "естественным образом" взаимодействовать с вашими собственными объектами, если они соответствуют интерфейсу массива.
Ответ 2
Небольшая загрузка в интересах тех, кто может найти это полезное (после отличного ответа от @dF.):
import numpy as np
from array import array
# Fixed size numpy array
def np_fixed(n):
q = np.empty(n)
for i in range(n):
q[i] = i
return q
# Resize with np.resize
def np_class_resize(isize, n):
q = np.empty(isize)
for i in range(n):
if i>=q.shape[0]:
q = np.resize(q, q.shape[0]*2)
q[i] = i
return q
# Resize with the numpy.array method
def np_method_resize(isize, n):
q = np.empty(isize)
for i in range(n):
if i>=q.shape[0]:
q.resize(q.shape[0]*2)
q[i] = i
return q
# Array.array append
def arr(n):
q = array('d')
for i in range(n):
q.append(i)
return q
isize = 1000
n = 10000000
Выход дает:
%timeit -r 10 a = np_fixed(n)
%timeit -r 10 a = np_class_resize(isize, n)
%timeit -r 10 a = np_method_resize(isize, n)
%timeit -r 10 a = arr(n)
1 loop, best of 10: 868 ms per loop
1 loop, best of 10: 2.03 s per loop
1 loop, best of 10: 2.02 s per loop
1 loop, best of 10: 1.89 s per loop
Кажется, что array.array немного быстрее, и "api" избавляет вас от хлопот, но если вам нужно больше, чем просто хранить удвоения, то numpy.resize не является плохим выбором в конце концов (если используется правильно).
Ответ 3
Вы обнаружите, что скорость Numpy намного выше, чем у массива Python:
import time
import numpy as np
size_of_vec = 1000
def pure_python_version():
t = time.time()
X = range(size_of_vec)
Y = range(size_of_vec)
Z = [X[i] + Y[i] for i in range(len(X)) ]
return time.time() - t
def numpy_version():
t1 = time.time()
X = np.arange(size_of_vec)
Y = np.arange(size_of_vec)
Z = X + Y
return time.time() - t
t1 = pure_python_version()
t2 = numpy_version()
print(t1, t2)
print("Numpy is in this example " + str(t1/t2) + " faster!")
Выход:
0.00024366378784179688 0.002840280532836914
Numpy is in this example 0.08578863426508856 faster!