- Как мне решить эту ошибку? TypeError: _append_dispatcher () отсутствует 1 обязательный позиционный аргумент: ‘values’
- 2 ответа
- Неудачное добавление в пустой массив NumPy
- 6 ответов
- Сложность с numpy.append(). Он работает, когда я набираю его самостоятельно в IDLE, но не при запуске
- Unsuccessful append to an empty NumPy array
- 6 Answers 6
- numpy insert & 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 .
Источник