#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([])
помощью andnp.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))