为什么:
print(np.delete(MatrixAnalytics(Cmp),[0],1))
MyNewMatrix = np.delete(MatrixAnalytics(Cmp),[0],1)
print("SecondPrint")
print(MyNewMatrix)
退货:
[[ 2. 2. 2. 2. 2.]
[ 1. 2. 2. 2. 2.]
[ 1. 2. 0. 2. 2.]
[ 2. 2. 2. 2. 2.]
[ 2. 2. 2. 0. 0.]
[ 1. 2. 2. 0. 2.]
[ 1. 2. 2. 2. 2.]
[ 1. 2. 2. 2. nan]
[ 2. 2. 2. 2. 2.]
[ 2. 2. 2. 2. nan]]
Second Print
[[-1. 0. 0. 0. 0.]
[-1. 0. 0. 0. 0.]
[-1. 0. -1. 0. 0.]
[-1. 0. 0. 0. 0.]
[-1. 0. 0. -1. 0.]
[-1. 0. 0. -1. 0.]
[-1. 0. 0. 0. 0.]
[-1. 0. 0. 0. nan]
[-1. 0. 0. 0. 0.]
[-1. 0. 0. 0. nan]]
这很奇怪,我想不通。为什么在3次打印之间没有任何代码行的情况下,值会发生变化?
def MatrixAnalytics(DataMatrix):
AnalyzedMatrix = DataMatrix
for i in range(len(AnalyzedMatrix)): #Browse Each Column
for j in range(len(AnalyzedMatrix[i])): #Browse Each Line
if j>0:
if AnalyzedMatrix[i][j] > 50:
if AnalyzedMatrix[i][j] > AnalyzedMatrix[i][j-1]:
AnalyzedMatrix[i][j] = 2
else:
AnalyzedMatrix[i][j] = 1
else:
if AnalyzedMatrix[i][j] <50:
if AnalyzedMatrix[i][j] > AnalyzedMatrix[i][j-1]:
AnalyzedMatrix[i][j] = 0
else:
AnalyzedMatrix[i][j] = -1
return AnalyzedMatrix
输入数组为:
[[55. 57.6 57.2 57. 51.1 55.9]
[55.3 54.7 56.1 55.8 52.7 55.5]
[55.5 52. 52.2 49.9 53.8 55.6]
[54.9 57.8 57.6 53.6 54.2 59.9]
[47.9 50.7 53.3 52.5 49.9 45.8]
[57. 56.2 58.3 55.4 47.9 56.5]
[56.6 54.2 57.6 54.7 50.1 53.6]
[54.7 53.4 52. 52. 50.9 nan]
[51.4 51.5 51.2 53. 50.1 50.1]
[55.3 58.7 59.2 56.4 53. nan]]
它似乎再次调用了函数MatrixAnalytics,但我不明白为什么
**
这样做有效:
**
MyNewMatrix = np.delete(MatrixAnalytics(Cmp),[0],1)
print(MyNewMatrix)
MyNewMatrix = np.delete(MatrixAnalytics(Cmp),[0],1)
print("SecondPrint")
print(MyNewMatrix)
我想我遇到了问题。在此代码中:
def MatrixAnalytics(DataMatrix):
AnalyzedMatrix = DataMatrix
...
...
return AnalyzedMatrix
AnalyzedMatrix
不是DataMatrix
的副本,它引用内存中的同一对象!
因此,在第一次调用MatrixAnalytics
时,您实际上正在修改作为参数给定的引用后面的对象(因为数组是可变的(
在第二个调用中,您给出了与参数相同的引用,因此它后面的数组已经被修改。
注意:return AnalyzedMatrix
语句只返回对DataMatrix
参数引用的对象的新引用(而不是副本(。
尝试替换此行:
AnalyzedMatrix = DataMatrix
使用这个(在您对MatrixAnalytics
的定义中(:
AnalyzedMatrix = np.copy(DataMatrix)
更多信息:
- 可变与不可变
numpy.delete()
numpy.copy()
我相信您在这两种情况下都想要相同的输出,遗憾的是,np.delete在数组本身中执行更改,所以当您调用第一行(np.delete(MatrixAnalytics(Cmp),[0],1))
时它删除第0列并将其保存在matrixanalytics中,因此永远不要在print语句中调用此函数,无论是在赋值期间调用它,还是在不赋值的情况下调用它,因为它会对给定数组本身进行更改,但永远不要在打印中调用,因为该列在print语句中将丢失。