Когда использовать `numpy .append ()`? - PullRequest
0 голосов
/ 27 марта 2020

Я читал в нескольких местах (например, здесь ), что numpy.append() никогда не следует использовать.

Например, если кто-то хочет сложить несколько вместе с массивами, гораздо лучше сделать это через промежуточный Python list:

import numpy as np


def stacker(arrs):
    result = arrs[0][None, ...]
    for arr in arrs[1:]:
        result = np.append(result, arr[None, ...], 0)
    return result


n = 1000
shape = (100, 100)
x = [np.random.randint(0, n, shape) for _ in range(n)]


%timeit np.array(x)
# 100 loops, best of 3: 17.6 ms per loop

%timeit np.concatenate([arr[None, ...] for arr in x])
# 100 loops, best of 3: 17.7 ms per loop

%timeit np.stack(x)
# 100 loops, best of 3: 18.3 ms per loop

%timeit stacker(x)
# 1 loop, best of 3: 12.5 s per loop

Я понимаю, что np.append() создает копию обоих входных данных NumPy массива, и это очень более неэффективно, чем list.append() или list.extend() в этом случае использования. Однако мне трудно поверить, что NumPy разработчики просто добавили бесполезную функцию.

Итак, каков вариант использования для numpy.append()?

1 Ответ

1 голос
/ 27 марта 2020

Посмотрите на его код:

arr = asanyarray(arr)
if axis is None:
    if arr.ndim != 1:
        arr = arr.ravel()
    values = ravel(values)
    axis = arr.ndim-1
return concatenate((arr, values), axis=axis)

Это простой интерфейс для concatenate. С axis это прямой вызов concatenate. Без него это ravels входов, что часто вызывает проблемы. И он конвертирует скаляры в массивы.

Если у вас есть 1d массив, то это простой способ добавить одно значение:

 In [8]: np.append(np.arange(3), 10)                                                            
 Out[8]: array([ 0,  1,  2, 10])

, но hstack также хорош:

 In [10]: np.hstack([np.arange(3), 10])                                                         
 Out[10]: array([ 0,  1,  2, 10])

Люди пишут функции, которые в то время казались хорошей идеей, обычно с особым вниманием к применению c. Но фактическое использование (и неправильное использование) может отличаться от ожидаемого.

np.stack - более новое и полезное дополнение.

Некоторое время в документации была заметка, призывающая нас использовать concatenate и stack и избегать всех остальных стеков, но это было ослаблено. Теперь они просто имеют:

Эта функция наиболее удобна для массивов с 3 измерениями. Например, для данных пикселей с высотой (первая ось), шириной (вторая ось) и каналами r / g / b (третья ось). Функции concatenate, stack и block обеспечивают более общие операции суммирования и объединения.

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