我对python很新,并且有一个愚蠢的问题。我找到了答案,找不到它,所以我在这里(StackOverflow上的第一个问题,如果有任何错误,请原谅)。
我有一个完美的功能(functions.Reservoir)。它需要一个复杂的numpy 2D数组和一个float值作为参数。它返回另一个复杂的numpy 2D数组。我尝试将所有这些返回值保存在一个新的numpy数组中。 问题是第一个打印命令给了我正确的值,这意味着我的功能正常工作。但是在for循环之外,当我打印l变量时,所有元素都具有相同的值,即最后一个元素应具有的值。
你能告诉我我做错了吗?
您可以帮助我的另一件事是将这些返回值保存为3D numpy数组。我不想使用vstack,因为有时我的循环迭代4000次而vstack会大幅减慢它。我现在所做的是将numpy数组保存为对象,然后再从此iterable中创建一个新数组。如果有更好的方法,请告诉我。提前致谢
k= np.zeros((400,3), dtype=np.complex128)
l= np.empty(noPoints1, dtype=object)
for i in xrange(noPoints1):
l[i] = functions.Reservoir(k, data[ OFFSET1+ Discard +i] )
print l[i]
k=l[i]
print l
以下是我的代码:
def determ(k1, k2, d):
dkdt = np.zeros_like(k1)
EA1 = np.absolute(k1[0])**2
EA2 = np.absolute(k1[1])**2
gain1= g1*(k1[2]-N0)/(1+s*EA1)
gain2= g2*(k1[2]-N0)/(1+s*EA2)
dkdt[0]= 0.5 * (1+ A*1j) * (gain1 - pd) * k1[0]
dkdt[1]= 0.5 * (1+ A*1j) * (gain2 - pd) * k1[1]
dkdt[2]= Stroom/e - k1[2]*ed - EA1*gain1 - EA2*gain2
return dkdt
def Reservoir(y,d):
q= y.shape[0]
mdata= 0.5*np.pi*d*maskvector #Maskvector 1D with q elements
for n in xrange(q):
yn = y[n,:] # Predictor
if n+1<q:
ytd= y[n+1,:] # Predictor Delayed Field strength
else:
ytd= y[n+1-q,:]
#See y as the state of a circular reservoir. If you reach the end at q, then it directly connects back at the start.
fn = determ(k1=yn, k2=ytd, d=mdata[n])
ybar = yn + fn*step # Corrector
if n+2<q:
ytdbar= y[n+2,:] # Corrector Delayed Field strength
else:
ytdbar= y[n+2-q,:]
fnbar = determ(k1= ybar, k2=ytdbar, d=mdata[n])
if n+1<q:
y[n+1] = yn + 0.5*(fn + fnbar)*step
else:
y[n+1-q] = yn + 0.5*(fn + fnbar)*step
return (y)
PS。我尝试了HYRY(Collecting results from a loop that returns NumPy Arrays)的答案,但我仍然得到所有元素的相同值。
答案 0 :(得分:0)
似乎你总是在同一个数组上工作。更改k=l[i].copy()
将确保在每个步骤处理新阵列。
return y
中的Reservoir
确实创建了一个新数组作为解释
docs:
请注意,数组切片不会复制内部数组数据,但会生成原始数据的新视图,