[英]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
保留函数的当前行为,则需要用NewX
和NewY
替换x
和y
所有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
: 显式复制
x
和y
的resize
:
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.