简体   繁体   English

调整numpy数组中的数据大小时出错

[英]Error when re-sizing data in numpy array

I have two arrays that I want to re-size, but I also want to retain the original values. 我有两个要调整大小的数组,但我也想保留原始值。 The code below re-sizes the arrays, but the problem is that it over-writes the original values, as you can see when you look at the output from the 下面的代码重新调整了数组的大小,但是问题是它覆盖了原始值,如您在查看数组的输出时所看到的那样。

print(x) 
print(y)

commands at the end of the script. 脚本末尾的命令。 However, if we comment out the line 但是,如果我们注释掉该行

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

then the original values of x and y print out properly. 然后正确打印出x和y的原始值。 However, if we remove the comment and leave the code as is, then x and y are apparently over-written becaue the 但是,如果我们删除注释并保留代码不变,则x和y显然会被覆盖,因为

print(x) 
print(y)

commands then output the values for NewX and NewY, respectively. 命令然后分别输出NewX和NewY的值。

My code is below. 我的代码如下。 Can anyone show me how to fix the code below so that x and y retain their original values, and so that NewX and NewY get their newly resized values? 谁能告诉我如何解决以下代码,以便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
NewX = x.copy()
NewY = y.copy()

numpy arrays also support the __copy__ interface, and can be copied with the copy module, so this would also work: numpy数组还支持__copy__接口,并且可以使用复制模块进行复制,因此这也可以工作:

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

If you want to retain the current behaviour of the function as-is, you'd need to replace all occurences of x and y with NewX and NewY . 如果NewX NewY保留函数的当前行为,则需要用NewXNewY替换xy所有NewY If the current behaviour of the function is wrong, you might keep them as they are. 如果该函数的当前行为是错误的,则可以将它们保持原样。

Make explicit copies of x and y in resize : 显式复制xyresize

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

Python always passes by reference, so any changes you make in subroutines are made to the actual passed objects. Python始终按引用传递,因此您在子例程中所做的任何更改都会对实际传递的对象进行。

The original resize repeats itself. 原来的resize重复。 Everything that is done for x it repeats for y. 对x完成的所有操作都会对y重复。 That's not good , because it means you have to maintain twice as much code as you really need. 这不好 ,因为这意味着您必须维护真正需要数量的两倍。 The solution is to make resize work on just one array, and call it twice (or as needed): 解决方案是使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

Call it like this: 这样称呼它:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM