python.array против numpy.array - PullRequest
       89

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

46 голосов
/ 22 сентября 2008

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

Ответы [ 2 ]

62 голосов
/ 22 сентября 2008

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

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

Numpy также гораздо более гибок, например, он поддерживает массивы объектов Python любого типа, а также способен «изначально» взаимодействовать с вашими собственными объектами, если они соответствуют интерфейсу массива .

3 голосов
/ 09 мая 2017

Небольшая начальная загрузка для тех, кто может найти это полезным (после превосходного ответа @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' избавит вас от хлопот, но если вам нужно больше, чем просто хранить double, тогда numpy.resize - не плохой выбор (если он используется правильно). *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...