0

Why does :

print(np.delete(MatrixAnalytics(Cmp),[0],1))
MyNewMatrix = np.delete(MatrixAnalytics(Cmp),[0],1)
print("SecondPrint")
print(MyNewMatrix)

returns :

[[ 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]]

This is weird, and can't figure this out. Why Would the values change without any line of code between 3 print ?

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

The input array is :

[[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]]

It seems that it call again the function MatrixAnalytics But I don't understand why

**

Doing this works :

**

MyNewMatrix = np.delete(MatrixAnalytics(Cmp),[0],1)
print(MyNewMatrix)
MyNewMatrix = np.delete(MatrixAnalytics(Cmp),[0],1)
print("SecondPrint")
print(MyNewMatrix)
0

2 Answers 2

4

I think I got the issue. In this code :

def MatrixAnalytics(DataMatrix):
    AnalyzedMatrix = DataMatrix
    ...
    ...                      
    return AnalyzedMatrix

AnalyzedMatrix is not a copy of DataMatrix, it's referencing to the same object in memory !

So on the first call of MatrixAnalytics, your are actually modifying the object behind the reference given as argument (because arrays are mutable).
In the second call, your are giving the same reference as argument so the array behind it has already been modified.

note : return AnalyzedMatrix statement just returns the a new reference to the object referenced by the DataMatrix argument (not a copy).

Try to replace this line :

AnalyzedMatrix = DataMatrix

with this one (in your definition of MatrixAnalytics) :

AnalyzedMatrix = np.copy(DataMatrix)

For more info :

Sign up to request clarification or add additional context in comments.

Comments

-1

I believe you want same output in both the cases, Sadly the thing is np.delete performs changes in the array itself, so when you called the first line (np.delete(MatrixAnalytics(Cmp),[0],1)) it deletes the 0th column and saves it in matrixanalytics, so never call this function in print statement, either call it during assignment or even without assignment as it will make the changes in the given array itself, but never in print since the column would be lost in the print statement.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.