Nano Hash - криптовалюты, майнинг, программирование

Python эквивалентен назначению массива (внутри цикла for) в Matlab

Это довольно простой вопрос, я много написал на случай, если люди найдут это, отставшие от меня на несколько часов, в разделе «ПОЧЕМУ ЭТО НЕ СРАБОТАЕТ?» поезд, чтобы помочь им


В Matlab следующий код создаст динамически увеличивающийся массив:

for i = 1:5
    array(i) = i*2;
end

но у меня есть некоторые проблемы со сложностями в Python. Следующее работает, но это не совсем то, что я хочу:

i = []
array = []
for i in range(1, 5):
    array.append(i*2)

Это работает, однако вы можете добавить только в конец. Вы также можете выделить значения для диапазона ячеек, которые уже существуют, помимо простого «вставить их в конец» (т.е. приведенный ниже код, который может заменить ячейки 14-36 в длинном списке из 100 ячеек)

i = []
array = list(xrange(1,100)) #creates list from 1 to 99
for i in range(14, 36):
    array[i] = i*2 #assign and overwrite previous cell values

Есть ли здесь какой-то универсальный метод кодирования, который сочетает в себе эти два? Решение для следующего кода:

i = []
array = list(xrange(1,50)) #creates list from 1 to 49
for i in range(34, 66):
    array[i] = i*2

Сообщение об ошибке:

IndexError: list assignment index out of range

Общие различия, которые я заметил до сих пор:

  • Python начинается с номера ячейки [0], а не [1]
  • Вы не можете динамически обновлять размеры списка, поэтому вам нужно использовать функцию добавления
  • (Возможно?) необходимо предварительно выделить списки перед их использованием

** Примечание для тех, кто испытывает трудности:

Одна ошибка, которая постоянно появлялась:

TypeError: 'builtin_function_or_method' object does not support item assignment

Это произошло из-за попытки присвоить такое значение:

array.append[i-1] = i*2

См. выше для правильного метода.

Разное

Спасибо за любую помощь! Я уверен, что это действительно просто, но у меня закончились идеи, и я не могу найти решение в предыдущих вопросах!

Другие подобные вопросы, которые либо не решили, либо я не понял:


  • В вашем разделе, где вы говорите «Решение следующего кода», вы составляете список от 1 до 49, но утверждаете, что он идет до 99. Это объясняет, почему переход к 66 выходит за пределы допустимого диапазона. 15.12.2015
  • Кроме того, list(xrange(1, 50)) — неэффективный способ записи range(1, 50). 15.12.2015
  • Могу я спросить, почему вы хотели бы такого поведения? Если вы предварительно выделяете свой список, я ожидаю, что вы не захотите присваивать значения элементам за пределами выделенного диапазона. 15.12.2015
  • @dpwilson извините, это должно было выйти за пределы диапазона, я показывал проблему, которую пытался решить. Я обновил комментарий. И спасибо за другое сокращение кода, я все еще учусь, поэтому большая часть этого - копипаста и редактирование из разных мест. Записал более быстрый способ, спасибо! 15.12.2015
  • @Lisa Я надеюсь, что конечным результатом будет автоматическая обработка наборов данных, которые обновляются в режиме реального времени на сервере. Я надеялся, что если бы я мог расширить списки за пределы предыдущего диапазона, это избавило бы меня от необходимости каждый раз повторно импортировать все данные - вместо этого я мог бы просто импортировать новые данные и добавлять их в конец. А учитывая, что у него частота дискретизации 100 Гц, длина списка входных данных всегда будет отличаться. 15.12.2015
  • @Lisa, я забыл сказать: последние данные на сервере могут измениться из-за других запущенных сценариев автоматической обработки, поэтому я хотел бы импортировать и заменить последние x-минуты данных, а не просто добавлять новые данные в конец. 15.12.2015

Ответы:


1

Вам нужно будет как минимум ознакомиться с numpy, если вы собираетесь приблизиться к функциональности, подобной Matlab, в python. Ниже приводится полезная ссылка: https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html

15.12.2015

2

Я предлагаю вам попытаться вообще избежать динамического увеличения размера вашего списка (как в MATLAB, так и в python), если у вас нет веской причины для этого. Возможно, вы могли бы проверить желаемый (окончательный) размер вашего списка в другом месте кода перед выделением.

Итак, я бы пошел по тому же пути, что и одно из ваших предложений, с той разницей, что вы можете выделить пустой список следующим образом:

arr = [None] * 100

for i in range(100):
    arr[i] = i*2

Или, как предложил Джон Гринолл, используйте numpy:

import numpy as np

arr = np.empty(100)

for i in range(100):
    arr[i] = i*2
15.12.2015
  • Спасибо! Я надеюсь создать скрипт, который автоматически обрабатывает данные, поэтому я буду импортировать новые данные (где последние несколько файлов старых данных могли измениться) для обработки с предыдущими данными. Без динамического увеличения размера или добавления, я предполагаю: # сократить новый импорт пополам # перезаписать старые данные скорректированными данными # предварительно выделить длину нового списка # затем заполнить его двумя отдельными списками (старые + исправленные данные и новые данные) / Динамическое обновление списка позволит мне просто перейти от первого нового файла и перезаписать/добавить все будущие данные в одном цикле for. Есть ли более простой способ? 15.12.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..