Matplotlib 干扰 NumPy(在 Windows 上)

kee*_*ive 11 python numpy matplotlib

下面描述的问题已被复制


说你有以下
import numpy as np
import matplotlib.pyplot as plt

x = np.random.randint(5, size=(100, 12), dtype=np.int64)
# [THERE IS ACTUALLY NO NEED TO SET THE DATA TYPE
# `x = np.random.rand(100, 12)` yields the same problem]
Run Code Online (Sandbox Code Playgroud)

并且您想计算x的排名。

>>> np.linalg.matrix_rank(x)
12
Run Code Online (Sandbox Code Playgroud)

一切安好。让我们从头开始一个新的会话,这次它的底层代码是

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1010)  # <-----
x               = np.random.randint(5, size=(100, 12), dtype=np.int64)
x_vals = y_vals = np.arange(0, .5, .05)

plt.plot(x_vals, y_vals, linestyle='--')

print(np.linalg.matrix_rank(x))
Run Code Online (Sandbox Code Playgroud)

这会打印0(!!)。更令人惊讶的是,这背后的原因是赋予linestyle(!!)的价值。我的意思是,拥有linestyle='-'(固体)可以让一切恢复正常。

这显然是一种不受欢迎的行为(我确实花了几个小时来精确定位)......但仍然:

如何 ?


这发生在使用 Python3.7.3 的 Windows 10 下
numpy==1.19.2      # since 1.19.0 actually
matplotlib==3.3.3  # between 3.1.3 and 3.3.3 for what I can tell
Run Code Online (Sandbox Code Playgroud)

Linux下没问题(同环境)


其他精度
  1. 这不会发生在 allx的形状上。很难说清楚。然而,这也不是随机的,并且与x的(垂直和/或水平)形状单调相关。
  2. 这个问题是转置不变的。
  3. xplt.plot调用之前的自身相比完全相同(与使用相比joblib.hash

在此处输入图片说明


这个问题更多的是留下痕迹而不是得到答案。这太奇怪了我不得不把它写在某个地方。我改变了我的linestyle...

问题的标题足够明确,可以让人们在这里遇到与我相同的问题。


另一个屏幕截图:

在此处输入图片说明

GIF 的代码如下。

import numpy as np
import matplotlib.pyplot as plt
import joblib as jl

linestyles = [
    'solid', '-',
    'dotted',  # '.', => ValueError: '.' 
    'dashed', '--',
    'dashdot', '-.',
    ':', '', ' '    
]

for ls in linestyles:
    print(26*'*', f"linestyle='{ls}'")
    
    np.random.seed(1010)
    x  = np.random.rand(9, 5)
    h0 = jl.hash(x)
    
    x_vals = y_vals = np.arange(0, .5, .05)
    plt.plot(x_vals, y_vals, linestyle=ls)
    # plt.show()
    
    h1 = jl.hash(x)
    mr = np.linalg.matrix_rank(x)
    print(
        '\t', mr, (not mr)*'<---------------[!!!]'
    )
    print('\t', 'Has not changed:', h0 == h1)
Run Code Online (Sandbox Code Playgroud)

D.L*_*D.L 0

我过去也遇到过类似的问题(基本上 matplotlib 没有按预期执行)。

这是我的问题: pythonplottingchartininteractiveviewervscode

基本上,绘图的调用方式以及完成后的删除方式:“如果关闭图形,则实际上是在删除它”。

我倾向于使用交互式环境(使用python 3.10in VScodeon windows 10),这有效:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1010)  # <-----
x = np.random.randint(5, size=(100, 12), dtype=np.int64)
x_vals = y_vals = np.arange(0, .5, .05)

x = np.linalg.matrix_rank(x)
print(x)

plt.plot(x_vals, y_vals, linestyle='-')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我得到这个结果(表现良好):

12
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述