Подтвердить что ты не робот

Python.array против numpy.array

Если вы создаете 1d-массив в Python, есть ли какая-либо польза от использования пакета NumPy?

4b9b3361

Ответ 1

Все зависит от того, что вы планируете делать с массивом. Если все, что вы делаете, - это создание массивов простых типов данных и ввод/вывод, модуль массива будет работать нормально.

Если, с другой стороны, вы хотите выполнить какой-либо численный расчет, модуль массива не поможет с этим. NumPySciPy) предоставляют вам широкий спектр операций между массивами и специальными функциями, которые полезны не только для научной работы, но и для таких вещей, как расширенные манипуляции с изображениями или вообще все, что вам необходимо для выполнения эффективных вычислений с большими объемами данных.

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!