Есть ли в numpy массивы динамических c? - PullRequest
0 голосов
/ 20 февраля 2020

Допустим, я создаю 2 numpy массива, один из которых является пустым массивом, а другой размером 1000x1000, состоит из нулей:

import numpy as np;
A1 = np.array([])
A2 = np.zeros([1000,1000])

Когда я хочу изменить значение в A2 кажется, это работает нормально:

A2[n,m] = 17

Приведенный выше код изменил бы значение позиции [n] [м] в A2 на 17.

Когда я попробую выше с A1 I получить эту ошибку:

A1[n,m] = 17

IndexError: index n выходит за границы для оси 0 с размером 0

Я знаю, почему это происходит, потому что нет определенного положение [n, m] в A1, и это имеет смысл, но мой вопрос заключается в следующем:

Есть ли способ определить массив Dynami c, без которого массив обновляется новыми строками и столбцами, если A[n,m] = somevalue вводится, когда n или m или оба больше границы массива A?

Это не обязательно должно быть в numpy, любая библиотека или метод, который может обновить размер массива, были бы великолепны , Если это метод, я могу представить, что существует if l oop, который проверяет, находится ли [n] [m] вне границ, и что-то с этим делает.

Я пришел из фона MATLAB, где это легко сделать. Я пытался найти что-то об этом в документации в numpy .array, но мне это не удалось.

РЕДАКТИРОВАТЬ: Я хочу знать, возможен ли вообще какой-либо способ создания динамического списка c в Python, а не только в библиотеке numpy. Из этого вопроса следует, что он не работает с numpy Создание динамического c массива с использованием numpy в python.

1 Ответ

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

Это не может быть сделано в numpy, и технически это также не может быть сделано в MATLAB. За кулисами MATLAB создает целую новую матрицу, затем копирует все данные в новую матрицу, а затем удаляет старую матрицу. Это не динамическое изменение размера, что на самом деле невозможно из-за того, как работают массивы / матрицы. Это очень медленно, особенно для больших массивов, поэтому в настоящее время MATLAB предупреждает вас не делать этого.

Numpy, как и MATLAB, не может изменять размеры массивов (на самом деле, в отличие от MATLAB это технически возможно, но только если вам повезет, поэтому я бы посоветовал не пытаться). Но чтобы избежать путаницы и медленного кода, который это вызывает в MATLAB, numpy требует, чтобы вы явно создали новый массив (используя np.zeros), а затем скопировали данные.

Python, в отличие от MATLAB, на самом деле имеет действительно изменяемую структуру данных: list. Для списков по-прежнему требуется достаточное количество элементов, поскольку это позволяет избежать ошибок индексации без вывода сообщений, которые трудно отследить в MATLAB, но вы можете изменить размер массива с очень хорошей производительностью. Вы можете создать эффективно n-мерный список, используя вложенные списки списков. Затем, когда список готов, вы можете преобразовать его в массив numpy.

...