带有numpy arange的MemoryError

问题描述 投票:5回答:4

我想创建一个10的幂数组作为图的y轴的标签。我正在使用plt.yticks()和matplotlib作为plt导入,但无论如何这在此无关紧要。我有一些情节,因为y轴从1e3变化到1e15。那些是原木图。 Matplotlib会自动显示带有1e2步的刻度线的那些,我希望步骤为10(为了能够正确使用minorticks)。

我想使用plt.yticks(numpy.arange(1e3, 1e15, 10))命令,但numpy.arange(1e3, 1e15, 10)导致MemoryError。是不是应该输出长度为13的数组?为什么内存会变满?

如何跨越此问题而不是手动构建阵列?

我也尝试使用内置的range但它不适用于浮点数。

谢谢。

python numpy matplotlib out-of-memory
4个回答
6
投票

试试logspaceNumPy

plt.yticks(numpy.logspace(3, 15, 13))

在这里,您给出起始和最后一个指数(10的幂)和它们之间的数据点数。如果您打印上面的网格,您将得到以下内容

array([1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07, 1.e+08, 1.e+09, 1.e+10,
   1.e+11, 1.e+12, 1.e+13, 1.e+14, 1.e+15])

1
投票

你也可以这样做:

10. ** np.arange(3,16)

小数点很重要,因为没有它你会溢出整数的默认int32 dtype


1
投票

另一种方法是使用LogLocator模块中的matplotlib.ticker而不是明确定义刻度位置,并手动增加刻度数(默认情况下,它会尝试设置好看的刻度数;即所以它看起来不太局促)。

在这个例子中,我在右边的Axes上设置了刻度数为13(使用numticks=13),你可以看到这增加了刻度数,所以每个整数次幂为10时有一个。

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

# Create figure and axes
fig, (ax1, ax2) = plt.subplots(ncols=2)

# Make yscale logarithmic
ax1.set_yscale('log')
ax2.set_yscale('log')

# Set y limits
ax1.set_ylim(1e3, 1e15)
ax2.set_ylim(1e3, 1e15)

# On ax2, lets tell the locator how many ticks we want
ax2.yaxis.set_major_locator(ticker.LogLocator(numticks=13))

ax1.set_title('default ticks')
ax2.set_title('LogLocator with numticks=13')

plt.show()

enter image description here

编辑:

要使用此方法添加次要刻度,我们可以使用另一个LogLocator,这次设置subs选项以说明每个十年我们想要的小刻度。在这里,我没有设置每0.1的小刻度,因为它太狭窄,所以只为一个子集完成。请注意,如果您设置此类次要刻度,则还需要使用NullFormatter关闭次刻度的刻度标签。

ax2.yaxis.set_major_locator(ticker.LogLocator(numticks=13))
ax2.yaxis.set_minor_locator(ticker.LogLocator(subs=(0.2,0.4,0.6,0.8),numticks=13))
ax2.yaxis.set_minor_formatter(ticker.NullFormatter())

enter image description here


0
投票

在这种情况下,来自numpy的函数logspace更合适。这个例子的答案是np.logspace(3,15,num=15-3+1, endpoint=True)

© www.soinside.com 2019 - 2024. All rights reserved.