Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top