Numpy append не работает

Как мне решить эту ошибку? TypeError: _append_dispatcher () отсутствует 1 обязательный позиционный аргумент: ‘values’

Я запускаю определенный код, и эта ошибка продолжает появляться после выполнения кода, показанного ниже:

2 ответа

Кажется, вы сбиваете с толку операции со списками и массивами. Ваша конкретная ошибка возникает в np.append . Вы (пере) читали его документы? Это должно быть первое, что вы делаете при получении подобной ошибки (прежде чем обращаться в SO за помощью!)

Что вы имеете в виду под словом «продолжает наступать»? Продолжаете ли вы делать то же самое в надежде, что в следующий раз ошибка не возникнет? Подобные ошибки не случайны 🙂

Сначала вы создаете два списка:

Обычно такие списки используются в цикле

Многократно добавляя значение в список. Это работает на месте.

Но в этой итерации вы переключаетесь на массивы:

np.append не клон с добавлением списка. Хорошо, вы поняли, что он вернул новое значение. Но где второе значение?

Индексирует 2-мерный массив, фрагмент строк и 1-й столбец. Это то, что вы хотели? Или предполагается, что 0 находится за пределами [] и будет той ценностью, которую вы добавляете к этому фрагменту? Без информации о массиве и ваших намерениях мы не можем сказать.

Также вы присваиваете результат np.append X_train . Эта переменная теперь является массивом, тогда как вначале она была списком [] . Зачем вы даже добавили X_train к этому списку, если вы просто собираетесь выбросить это значение. Или вы собирались сделать:

Добавление фрагмента массива в список X_train ?

Затем вы оборачиваете массивы в np.array . Почему? np.append , если работает, возвращает массив. Не нужно снова «делать» массив!

Последний шаг предположительно добавляет конечное измерение к X_train .

Что произойдет в следующей итерации? Вы снова (пытаетесь) назначить результат np.append для X_train . Это отбрасывает X_train , который вы так кропотливо создали в конце предыдущей итерации.

Похоже, вы взяли модель добавления списка и неуклюже преобразовали ее в добавление массива. Это не только не работает, но и неэффективно. Добавление к списку работает на месте, добавляя ссылки в список. np.append (и другие np.concatenate/stack функции) каждый раз создает новый массив, что намного дороже. Обычно мы рекомендуем придерживаться добавления списка в цикле и создавать массив с одним вызовом в конце.

По сути, при построении такой сложной итерации обращайте пристальное внимание на то, что происходит с переменными при прохождении цикла. Не делайте предположений. Протестируйте фрагменты кода в интерактивном сеансе. print для проверки переменных, обращая особое внимание на тип и форму / размер. Если хотите, вы также можете использовать отладчик для проверки значений в цикле. И снова — ПРОЧИТАЙТЕ документацию!

Читайте также:  Как настроить проводной модем ростелекома

numpy.append имеет два обязательных параметра, arr и values , но вы указываете только один в обеих этих строках:

Вам нужно указать как массив, который вы добавляете, так и значения, которые нужно добавить.

Источник

Неудачное добавление в пустой массив NumPy

Я пытаюсь заполнить пустую(не np.пусто!) массив со значениями с помощью append, но я получаю ошибку:

мой код выглядит следующим образом:

6 ответов

numpy.append довольно отличается от списка.добавить в Python. Я знаю, что это сбросило несколько программистов, новых для numpy. numpy.append больше похоже на concatenate, он создает новый массив и заполняет его значениями из старого массива и новыми значениями, которые будут добавлены. Например:

Я думаю, что вы могли бы достичь своей цели, делая что-то вроде:

Если вам нужно создать массив numpy с помощью цикла, и вы не знаете заранее, каким будет конечный размер массива, вы можете сделать что-то вроде:

в моем примере результатом будет массив (N, 2), где N-количество раз, когда цикл выполнялся, но, очевидно, вы можете настроить его под свои нужды.

ошибка, которую вы видите, не имеет ничего общего с типами, она связана с формой массивов numpy, которые вы пытаетесь объединить. Если вы это сделаете np.append(a, b) формы a и b должны совпадать. Если вы добавите (2, n) и (n,), вы получите массив (3, n). Ваш код пытается добавить a (1, 0) к a (2,). Эти формы не совпадают, поэтому вы получаете ошибку.

Я могу неправильно понять вопрос, но если вы хотите объявить массив определенной формы, но ничего внутри, может быть полезно следующее:

инициализировать пустой массив:

теперь вы можете использовать этот массив для добавления строк подобной формы к нему. Помните, что массив numpy неизменяем, поэтому для каждой итерации создается новый массив:

np.vstack и np.hstack является наиболее распространенным методом объединения массивы numpy, но из Matlab я предпочитаю np.r_ и np.когда:

сцепление 1d:

конкатенации строк:

объединить столбцы:

эта ошибка возникает из — за того, что вы пытаетесь определить объект формы (0,) как объект формы (2,). Если вы добавляете то, что хотите, не заставляя его быть равным результату[0], нет никакой проблемы:

но когда вы определяете result[0] = b вы приравниваете объекты разных форм, и вы не можете этого сделать. Что ты пытаешься сделать?

вот результат запуска вашего кода в Ipython. Обратите внимание, что result это (2,0) массив, 2 строки, 0 столбцов, 0 элементов. The append производит (2,) массив. result[0] is (0,) массив. Ваше сообщение об ошибке связано с попыткой назначить этот массив элементов 2 в слот размера 0. С result is dtype=float64 , только скаляры могут быть назначены его элементам.

np.array не является списком Python. Все элементы массива имеют один и тот же тип (как указано в dtype ). Заметьте также, что result не является массивом массивов.

Читайте также:  Не работает пауэр банк сяоми

результат мог быть построен как

то же самое не верно для результата.

np.zeros((2,0)) также производит свой result .

на самом деле есть еще одна причуда result .

не изменяет значения result . Он принимает назначение, но поскольку он имеет 0 столбцов, нет места для размещения 1 . Это назначение будет работать в результате было создано как np.zeros((2,1)) . Но это все еще не может принять список.

но если result имеет 2 столбца, затем вы можете назначить список 2 элементов одной из его строк.

что именно вы хотите result чтобы выглядеть после append операции?

numpy.append всегда копирует массив перед добавлением новых значений. Ваш код эквивалентен следующему:

возможно, вы хотите это сделать?

поэтому поток ‘умножение двух матриц поэлементное, где один из массивов имеет массивы в качестве элементов есть пример построения массива из массивов. Если подмножества имеют одинаковый размер, numpy создает 2d-массив. Но если они отличаются по длине, это делает массив с dtype=object , и подмассивы сохранить свою идентичность.

после этого вы можете сделать что-то вроде этого:

Источник

Сложность с numpy.append(). Он работает, когда я набираю его самостоятельно в IDLE, но не при запуске

Я ценю, что это не очень общая или применимая проблема для кого-то еще, но она меня озадачила и может научить меня больше, чем я думаю.

Ранее point_history_x (и y) определяются глобально как numpy.zeros((1)). При запуске для точки (0,0) он возвращает 0 для обоих массивов истории. Когда я набираю каждый уровень в оболочку python, он отлично работает и создает массив вариаций x; но когда я запускаю модуль, он просто возвращает ввод.

Кажется, что все доказательства указывают на то, что я неправильно добавляю append, но, как я уже сказал, я набираю его так же, как в оболочке, и работает нормально.

Это действительно разочаровывает, любые комментарии были бы весьма признательны.

Добавление в этом случае возвращает новый массив. Он не меняет point_history_x .

То, что мы видим, это то, что np.append работает — никаких исключений или чего-либо еще, — но a не модифицируется вызовом, он просто возвращает новый массив. Второй раз, когда я называю np.append я сохранить результат, назначив ее. a

В других частях вашего кода есть и некоторые нетрадиционные/избыточные вещи. Параллельная распаковка параметров не идеальна, поскольку она была удалена в Python 3 (мысль 2to3 будет автоматически конвертировать для вас), но главная причина заключается в том, что здесь сложнее усложнять ситуацию. Вы можете изменить

и вызовите код с gradient_descent(*pt) .

Я также думаю, что вам будет лучше использовать обычный список Python для point_history_x и point_history_y . С массивом NumPy вы в конечном итоге выделяете большие объемы памяти на каждой итерации цикла.

Источник

Unsuccessful append to an empty NumPy array

I am trying to fill an empty(not np.empty!) array with values using append but I am gettin error:

Читайте также:  Не работает задний стоп ниссан кашкай

My code is as follows:

And I am getting:

6 Answers 6

I might understand the question incorrectly, but if you want to declare an array of a certain shape but with nothing inside, the following might be helpful:

Initialise empty array:

Now you can use this array to append rows of similar shape to it. Remember that a numpy array is immutable, so a new array is created for each iteration:

np.vstack and np.hstack is the most common method for combining numpy arrays, but coming from Matlab I prefer np.r_ and np.c_:

Concatenate 1d:

Concatenate rows:

Concatenate columns:

numpy.append is pretty different from list.append in python. I know that’s thrown off a few programers new to numpy. numpy.append is more like concatenate, it makes a new array and fills it with the values from the old array and the new value(s) to be appended. For example:

I think you might be able to achieve your goal by doing something like:

If you need to create a numpy array using loop, and you don’t know ahead of time what the final size of the array will be, you can do something like:

In my example result will be an (N, 2) array, where N is the number of times the loop ran, but obviously you can adjust it to your needs.

Источник

numpy insert & append

У меня есть массив:

потому что X[:,0] имеет неправильные размеры.

Разве это не странно?

Этот путь вокруг проблемы кажется немного грязным:

В MATLAB можно просто написать: X(:,361) = X(:,1) .

Я понял, что это тоже работает:

но почему append работает не так?

Главное отличие состоит в том, что в MATLAB все имеет как минимум 2 измерения.

и, как вы заметили, это позволяет индексировать «за пределами конца» — путь дальше

Но при numpy индексировании уменьшаются размеры без 2-го этажа:

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

x[:,0][:,None] — использование np.newaxis (alias None ) — хороший метод общего назначения. x[:,[0]] , x[:,0:1] , x[:,0].reshape(-1,1) также имеют свое место.

append — это просто concatenate которая заменяет список аргументов на 2. Это запутанная имитация списка append. Это написано Python, чтобы вы могли прочитать его (как это делают опытные кодеры MATLAB).

insert — более сложная функция (также в Python). Добавляя в конце, он делает что-то вроде:

Это последнее задание работает, потому что обе стороны имеют одинаковую форму (технически они просто должны быть передаваемые формы). Поэтому insert ничего не говорит нам о том, что должно или не должно работать в более основных операциях, таких как concatenate .

Источник

Оцените статью