Добавление 2D-массива при циклическом просмотре

#python #numpy #multidimensional-array

#python #numpy #многомерный массив

Вопрос:

Я хочу сохранить определенные значения в 2D-массиве. В приведенном ниже коде. Я хочу sT быть total . Когда внутренний цикл выполняет значения, которые будут сохранены в строках, а затем в следующем столбце, когда произойдет увеличение внешнего цикла.

 class pricing_lookback:
  def __init__(self,spot,rate,sigma,time,sims,steps):
    self.spot = spot
    self.rate = rate
    self.sigma = sigma
    self.time = time
    self.sims = sims
    self.steps = steps
    self.dt = self.time/self.steps

  def call_floatingstrike(self):

      simulationS = np.array([])
      simulationSt = np.array([])
      call2 = np.array([])
      total = np.empty(shape=[self.steps, self.sims])
      for j in range(self.sims):
          sT = self.spot
          pathwiseminS = np.array([])
          for i in range(self.steps):
              phi= np.random.normal()
              sT *= np.exp((self.rate-0.5*self.sigma*self.sigma)*self.dt   self.sigma*phi*np.sqrt(self.dt))
              pathwiseminS = np.append(pathwiseminS, sT)
              np.append(total,[[j,sT]])###This should store values in rows of j column
              #print (pathwiseminS)
          #tst1 = np.append(tst1, pathwiseminS[1])
          call2 = np.append(call2, max(pathwiseminS[self.steps-1]-self.spot,0))
          #print (pathwiseminS[self.steps-1])
          #print(call2)
          simulationSt = np.append(simulationSt,pathwiseminS[self.steps-1])
          simulationS =  np.append(simulationS,min(pathwiseminS))
      call = max(np.average(simulationSt) - np.average(simulationS),0)
      return call, total#,call2, 
 

Комментарии:

1. x=np.array([]) x=np.append(x,...) Подход плохой — неэффективный и трудный для понимания. Собирайте значения в списки (или список списков). Добавление списка выполняется быстрее.

2. Оптимизация памяти @hpaulj — последний этап. Сначала я хочу знать, как добавить 2D-массив

3. Я не говорю об оптимизации памяти. Речь идет о правильном написании кода. Какие ошибки вы получаете? np.append это плохо названный интерфейс np.concatenate . concatenate требуется соответствие размеров. Это включает в себя начальный массив, который (ы) вы создаете с np.array([]) помощью and np.empty(...) . Ни один из них не является заменой списка [] .

Ответ №1:

Вот простой пример того, что, я думаю, вы пытаетесь сделать:

 for i in range(5):
    row = np.random.rand(5,)
    if i == 0:
        my_array = row
    else:
        my_array = np.vstack((my_array, row))
    print(row)
 

Однако это не очень эффективно с памятью, особенно если вы имеете дело с большими массивами, поскольку при этом необходимо выделять новую память в каждом цикле. Было бы намного лучше предварительно выделить пустой массив, а затем заполнить его, если это возможно.

Чтобы ответить на вопрос о том, как добавить столбец, это было бы что-то вроде этого:

 import numpy as np

x = np.random.rand(5, 4)
column_to_append = np.random.rand(5,)
np.insert(x, x.shape[1], column_to_append, axis=1)
 

Опять же, это неэффективно для памяти, и его следует избегать, когда это возможно. Предварительное распределение намного лучше.

Комментарии:

1. Мне нравится эта идея добавления столбца, но я не знаю, как расставить точки. В приведенном выше коде pathwiseminS может добавляться total каждый раз, когда заканчивается внутренний цикл for. @Wade Есть идеи, как это сделать?

2. @VarunYadav смотрите Обновленный ответ о том, как добавить столбец.

3. Я устал от этого np.insert(pathwiseminS, pathwiseminS.shape[1], total, axis=1) , теперь я получаю сообщение об ошибке IndexError: tuple index out of range Приведенная выше строка расположена чуть выше call2 = np.append(call2, max(pathwiseminS[self.steps-1]-self.spot,0))