2010-12-01 139 views
0

我有两个我想重新调整大小的数组,但我也想保留原始值。下面的代码重新大小的数组,但问题是,它超额写的原始值,当你查看输出从重新调整numpy数组中的数据时出错

print(x) 
print(y) 

命令在脚本结束时,你可以看到。但是,如果我们注释掉该行

# NewX,NewY=resize(x,y,xmin=MinRR,xmax=MaxRR,ymin=minLVET,ymax=maxLVET) 

那么x和y的原始值会正确打印出来。但是,如果我们按原样删除注释和离开代码,那么x和y显然过书面becaue的

print(x) 
print(y) 

命令,然后输出分别下一页末和NewY,值。

我的代码如下。 任何人都可以告诉我如何修复下面的代码,以便x和y保留它们的原始值,并使NewX和NewY获取其新调整的值?

import numpy as np 

def GetMinRR(age): 
    MaxHR = 208-(0.7*age) 
    MinRR = (60/MaxHR)*1000 
    return MinRR 

def resize(x,y,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0): 
    # Create local variables 
    NewX = x 
    NewY = y 
    # If the mins are greater than the maxs, then flip them. 
    if xmin>xmax: xmin,xmax=xmax,xmin 
    if ymin>ymax: ymin,ymax=ymax,ymin 
    #----------------------------------------------------------------------------------------------  
    # The rest of the code below re-calculates all the values in x and then in y with these steps: 
    #  1.) Subtract the actual minimum of the input x-vector from each value of x 
    #  2.) Multiply each resulting value of x by the result of dividing the difference 
    #   between the new xmin and xmax by the actual maximum of the input x-vector 
    #  3.) Add the new minimum to each value of x 
    # Note: I wrote in x-notation, but the identical process is also repeated for y 
    #----------------------------------------------------------------------------------------------  
    # Subtracts right operand from the left operand and assigns the result to the left operand. 
    # Note: c -= a is equivalent to c = c - a 
    NewX -= x.min() 

    # Multiplies right operand with the left operand and assigns the result to the left operand. 
    # Note: c *= a is equivalent to c = c * a 
    NewX *= (xmax-xmin)/NewX.max() 

    # Adds right operand to the left operand and assigns the result to the left operand. 
    # Note: c += a is equivalent to c = c + a 
    NewX += xmin 

    # Subtracts right operand from the left operand and assigns the result to the left operand. 
    # Note: c -= a is equivalent to c = c - a 
    NewY -= y.min() 

    # Multiplies right operand with the left operand and assigns the result to the left operand. 
    # Note: c *= a is equivalent to c = c * a 
    NewY *= (ymax-ymin)/NewY.max() 

    # Adds right operand to the left operand and assigns the result to the left operand. 
    # Note: c += a is equivalent to c = c + a 
    NewY += ymin 

    return (NewX,NewY) 

# Declare raw data for use in creating logistic regression equation 
x = np.array([821,576,473,377,326],dtype='float') 
y = np.array([255,235,208,166,157],dtype='float') 

# Call resize() function to re-calculate coordinates that will be used for equation 
MinRR=GetMinRR(34) 
MaxRR=1200 
minLVET=(y[4]/x[4])*MinRR 
maxLVET=(y[0]/x[0])*MaxRR 
NewX,NewY=resize(x,y,xmin=MinRR,xmax=MaxRR,ymin=minLVET,ymax=maxLVET) 

print 'x is: ',x 
print 'y is: ',y 

回答

3
NewX = x.copy() 
NewY = y.copy() 

numpy的阵列还支持__copy__接口,并且可与复印模块被复制,所以这也将工作:

NewX = copy.copy(x) 
NewY = copy.copy(y) 

如果你想保留当前的行为的功能,您需要用NewXNewY替换xy的所有出现次数。如果该函数的当前行为错误,则可以保持原样。

+0

这适用于numpy的阵列,而不是常规列表。但它肯定比我的解决方案更容易理解。 +1 – mtrw 2010-12-01 23:10:54

1

使xy明确的副本resize

def resize(...): 
    NewX = [t for t in x] 
    NewY = [t for t in y] 

的Python总是按引用传递,所以在子程序所做的任何更改都实际传递的对象做。

0

原始resize重复自己。为x重复y的所有事情。 That's not good,因为这意味着你必须保持你真正需要的两倍的代码。该解决方案是只在一个阵列上resize工作,并调用它两次(或根据需要):

def resize(arr,lower=0.0,upper=1.0): 
    # Create local variables 
    result = arr.copy() 
    # If the mins are greater than the maxs, then flip them. 
    if lower>upper: lower,upper=upper,lower 
    #----------------------------------------------------------------------------------------------  
    # The rest of the code below re-calculates all the values in x and then in y with these steps: 
    #  1.) Subtract the actual minimum of the input x-vector from each value of x 
    #  2.) Multiply each resulting value of x by the result of dividing the difference 
    #   between the new lower and upper by the actual maximum of the input x-vector 
    #  3.) Add the new minimum to each value of x 
    # Note: I wrote in x-notation, but the identical process is also repeated for y 
    #----------------------------------------------------------------------------------------------  
    # Subtracts right operand from the left operand and assigns the result to the left operand. 
    # Note: c -= a is equivalent to c = c - a 
    result -= result.min() 

    # Multiplies right operand with the left operand and assigns the result to the left operand. 
    # Note: c *= a is equivalent to c = c * a 
    result *= (upper-lower)/result.max() 

    # Adds right operand to the left operand and assigns the result to the left operand. 
    # Note: c += a is equivalent to c = c + a 
    result += lower 
    return result 

这样称呼它:

NewX=resize(x,lower=MinRR,upper=MaxRR) 
NewY=resize(y,lower=minLVET,upper=maxLVET)