将二维数组函数 return 值分配给新的 numpy 数组
Assigning 2D-array function return values to a new numpy array
我是 python 的新手,有一个愚蠢的问题。我查找答案,找不到答案,所以我来了(Whosebug 上的第一个问题,如有错误请原谅)。
我有一个功能 (functions.Reservoir) 可以完美运行。它采用一个复杂的 numpy 二维数组和一个浮点值作为参数。它 return 返回另一个复杂的 numpy 二维数组。我尝试将所有这些 return 值保存在一个新的 numpy 数组中。
问题是第一个打印命令给了我正确的值,这意味着我的函数工作正常。但是在 for 循环之外,当我打印 l 变量时,所有元素都具有相同的值,即最后一个元素应该具有的值。
你能告诉我哪里做错了吗?
您可以帮助我的另一件事是将这些 return 值保存为 3D numpy 数组的方法。我不想使用 vstack,因为有时我的循环会迭代 4000 次,而 vstack 会大大降低它的速度。我现在要做的是将 numpy 数组保存为对象,然后从这个可迭代对象中创建一个新数组。如果有更好的方法,请告诉我。提前致谢
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) 的答案,但我仍然得到所有元素的相同值。
看来你总是在同一个数组上工作。 k=l[i].copy()
中的更改将确保在每个步骤中处理一个新数组。
Reservoir
中的 return y
不会像
docs :
Note that slices of arrays do not copy the internal array data but also produce new views of the original data,
我是 python 的新手,有一个愚蠢的问题。我查找答案,找不到答案,所以我来了(Whosebug 上的第一个问题,如有错误请原谅)。
我有一个功能 (functions.Reservoir) 可以完美运行。它采用一个复杂的 numpy 二维数组和一个浮点值作为参数。它 return 返回另一个复杂的 numpy 二维数组。我尝试将所有这些 return 值保存在一个新的 numpy 数组中。 问题是第一个打印命令给了我正确的值,这意味着我的函数工作正常。但是在 for 循环之外,当我打印 l 变量时,所有元素都具有相同的值,即最后一个元素应该具有的值。
你能告诉我哪里做错了吗?
您可以帮助我的另一件事是将这些 return 值保存为 3D numpy 数组的方法。我不想使用 vstack,因为有时我的循环会迭代 4000 次,而 vstack 会大大降低它的速度。我现在要做的是将 numpy 数组保存为对象,然后从这个可迭代对象中创建一个新数组。如果有更好的方法,请告诉我。提前致谢
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) 的答案,但我仍然得到所有元素的相同值。
看来你总是在同一个数组上工作。 k=l[i].copy()
中的更改将确保在每个步骤中处理一个新数组。
Reservoir
中的 return y
不会像
docs :
Note that slices of arrays do not copy the internal array data but also produce new views of the original data,