Является ли numpy.array () эквивалентным numpy.stack (..., axis = 0)? - PullRequest
1 голос
/ 15 октября 2019

Я сделал себе пример:

import numpy as np
arrays = [np.random.rand(3,4) for _ in range(10)]
arr1 = np.array(arrays)
print(arr1.shape)
arr2 = np.stack(arrays, axis=0)
print(arr2.shape)

Я обнаружил, что arr1 и arr2 имеют одинаковую форму и содержание. Так эти два метода (np.array () и np.stack (..., axis = 0) эквивалентны?

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

В общем, вы должны получить что-то похожее из двух, но будут некоторые крайние случаи. Например, передача разбитых списков в np.array даст np.array списков, но np.stack вызовет исключение:

In [119]: np.stack([[1,2], [4,5,6]], axis=0)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-119-2ba66e6300d6> in <module>()
----> 1 np.stack([[1,2], [4,5,6]], axis=0)

<__array_function__ internals> in stack(*args, **kwargs)

    423     shapes = {arr.shape for arr in arrays}
    424     if len(shapes) != 1:
--> 425         raise ValueError('all input arrays must have the same shape')
    426
    427     result_ndim = arrays[0].ndim + 1

ValueError: all input arrays must have the same shape

In [120]: np.array([[1,2], [4,5,6]])
Out[120]: array([list([1, 2]), list([4, 5, 6])], dtype=object)
1 голос
/ 15 октября 2019

np.array скомпилировано, и что-то вроде черного ящика. Он работает предсказуемо для списков списков чисел, при условии, что он может создавать многомерный массив. Откат - это массив объектов типа d (массив списков) или, в некоторых случаях, ошибка ( Создание проблемы с массивом-пустышкой (невозможно преобразовать входной массив из shape (2) в shape (1)) ).

np.stack - это функция покрытия для np.concatenate. Это код Python.

Сначала он создает все входные массивы:

arrays = [asanyarray(arr) for arr in arrays]

asanyarray - это просто вызов без копирования np.array.

Затем он проверяетформы - все они должны быть одинаковыми

shapes = {arr.shape for arr in arrays}

, тогда он добавляет измерение к каждому (детали опущены)

expanded_arrays = [arr[sl] for arr in arrays]

и объединяет их:

concatenate(expanded_arrays, axis=axis, out=out)

Начиная со списка массивов, он выполняет примерно ту же работу, что и np.array (временные параметры аналогичны для больших списков). Как отмечалось в другом ответе, он не даст рваный массив. Но где stack действительно хорошо, это когда мы хотим использовать axis. Без этого нам бы пришлось transpose array версия.

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