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='-'(固体)可以让一切恢复正常。
这显然是一种不受欢迎的行为(我确实花了几个小时来精确定位)......但仍然:
如何 ?
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下没问题(同环境)
x的形状上。很难说清楚。然而,这也不是随机的,并且与x的(垂直和/或水平)形状单调相关。x与plt.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)
我过去也遇到过类似的问题(基本上 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)