每次执行代码时,Numpy 2-D 数组都会更改值

Posted

技术标签:

【中文标题】每次执行代码时,Numpy 2-D 数组都会更改值【英文标题】:Numpy 2-D array changing values everytime I execute the code 【发布时间】:2021-12-06 00:38:12 【问题描述】:

我正在使用 python 和 numpy 手动解决一些电力系统问题,我遇到的一个问题是交换列和行。但是每次我执行代码时,它在不同的位置都有不同的值。

这是我的代码:

 Y = 
         0.00-10.00j        -0.00+10.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j
        -0.00+10.00j        24.63-71.51j        -8.21+20.52j       -16.42+41.04j          0.00+0.00j          0.00+0.00j
          0.00+0.00j        -8.21+20.52j        24.63-69.51j          0.00+0.00j         -0.00+8.00j          0.00+0.00j
          0.00+0.00j       -16.42+41.04j          0.00+0.00j        24.63-61.51j        -8.21+20.52j          0.00+0.00j
          0.00+0.00j          0.00+0.00j         -0.00+8.00j        -8.21+20.52j        24.63-61.51j          0.00+0.00j
          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00-8.00j
Ya = np.copy(Y) # Y is the 2D array above
print('\n'.join([''.join([':20.2f'.format(item) for item in row]) 
      for row in Ya]))
print('\n')
Ya[[1, 3]] = Ya[[3, 1]]
Ya[[2, 4]] = Ya[[4, 2]]
Ya[[3, 4]] = Ya[[4, 3]]
Ya[[3, 5]] = Ya[[5, 3]]

Ya[: ,[1, 3]] = Ya[:, [3, 1]]
Ya[:, [2, 4]] = Ya[:, [4, 2]]
Ya[:, [3, 4]] = Ya[:, [4, 3]]
Ya[:, [3, 5]] = Ya[:, [5, 3]]

print('\n'.join([''.join([':20.2f'.format(item) for item in row]) 
      for row in np.array(Ya)]))
print('\n')

# Reduced Matrix
temp1 = np.copy(Ya[0:4, 0:4])
temp2 = np.copy(Ya[0:4, 4:])
temp3 = np.copy(Ya[4:, 0:4])
temp4 = np.copy(Ya[4:, 4:])

Y_r = temp1 - (temp2 * (np.matrix(temp4).getI()) * temp3)
print('\n'.join([''.join([':20.2f'.format(item) for item in row]) 
      for row in np.array(Y_r)]))

如您所见,我多次打印 Ya 只是为了检查一切是否正常。但即使在第一次 Ya 打印中,每次运行代码时它都会更改值。

我不知道它是否与此有关,但我正在 Google Colab 上运行它。上面代码中的第一行与我创建 Y 的其余代码位于不同的单元格中。

【问题讨论】:

在第一行打印Y,然后再执行其他操作。没有看到任何其他代码,就不可能重现您的问题。 @MadPhysicist 完成 你能显示可疑的输出吗? 我看到打印语句,但没有结果。我从这里看不到你的屏幕! 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:

如果您每次执行时都获得不同的值,我认为这一定与您的环境有关。我复制了您的代码并进行了一些细微的更改以进行测试,每次运行时,我都会得到相同的输出:

import numpy as np

Y = np.array([[0.00-10.00j, -0.00+10.00j, 0.00+0.00j, 0.00+0.00j, 0.00+0.00j, 0.00+0.00j],
              [-0.00+10.00j, 24.63-71.51j, -8.21+20.52j, -16.42+41.04j, 0.00+0.00j, 0.00+0.00j],
              [0.00+0.00j, -8.21+20.52j, 24.63-69.51j, 0.00+0.00j, -0.00+8.00j, 0.00+0.00j],
              [0.00+0.00j, -16.42+41.04j, 0.00+0.00j, 24.63-61.51j, -8.21+20.52j, 0.00+0.00j],
              [0.00+0.00j, 0.00+0.00j, -0.00+8.00j, -8.21+20.52j, 24.63-61.51j, 0.00+0.00j],
              [0.00+0.00j, 0.00+0.00j, 0.00+0.00j, 0.00+0.00j, 0.00+0.00j, 0.00-8.00j]])

Ya = np.copy(Y)
def print_mat(mat):
    print('\n'.join([''.join([':20.2f'.format(item) for item in row]) for row in mat]))

print_mat(Ya)
print('\n')
Ya[[1, 3]] = Ya[[3, 1]]
Ya[[2, 4]] = Ya[[4, 2]]
Ya[[3, 4]] = Ya[[4, 3]]
Ya[[3, 5]] = Ya[[5, 3]]

print_mat(Ya)

总是给我这个输出:

         0.00-10.00j         0.00+10.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j
         0.00+10.00j        24.63-71.51j        -8.21+20.52j       -16.42+41.04j          0.00+0.00j          0.00+0.00j
          0.00+0.00j        -8.21+20.52j        24.63-69.51j          0.00+0.00j          0.00+8.00j          0.00+0.00j
          0.00+0.00j       -16.42+41.04j          0.00+0.00j        24.63-61.51j        -8.21+20.52j          0.00+0.00j
          0.00+0.00j          0.00+0.00j          0.00+8.00j        -8.21+20.52j        24.63-61.51j          0.00+0.00j
          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00-8.00j


         0.00-10.00j         0.00+10.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j
          0.00+0.00j       -16.42+41.04j          0.00+0.00j        24.63-61.51j        -8.21+20.52j          0.00+0.00j
          0.00+0.00j          0.00+0.00j          0.00+8.00j        -8.21+20.52j        24.63-61.51j          0.00+0.00j
          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00+0.00j          0.00-8.00j
         0.00+10.00j        24.63-71.51j        -8.21+20.52j       -16.42+41.04j          0.00+0.00j          0.00+0.00j
          0.00+0.00j        -8.21+20.52j        24.63-69.51j          0.00+0.00j          0.00+8.00j          0.00+0.00j

我在您的其余代码中看不到任何其他不应该每次都以相同方式运行的语句。如果可能的话,我建议您尝试在您可以更好地控制的环境中运行。

【讨论】:

是的,这可能是 Google Colab 的问题,我认为它会保存上次执行代码中的值,即使它在同一个单元格中。我在其他环境中尝试过它并且它有效。感谢您的帮助。

以上是关于每次执行代码时,Numpy 2-D 数组都会更改值的主要内容,如果未能解决你的问题,请参考以下文章

可以将numpy数组插入python中的函数吗?

每次 Retrofit 调用的值更改时,Android 都会通知

为numpy数组分配新值的问题[重复]

将相同numpy数组的两个视图组合成单个视图而不复制数组?

每次渲染正文时都会调用 SwiftUI Picker onReceive()

numpy--1.2属性