Np数组的值在不做任何事情的情况下被更改



为什么:

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语句中将丢失。

相关内容

最新更新