numpy范围的MemoryError

时间:2018-09-18 09:18:41

标签: python numpy matplotlib out-of-memory

我想创建10的幂的数组作为图的y轴的标签。 我正在使用plt.yticks(),并将matplotlib导入为plt,但是无论如何这都没关系。 我有一些图,其中y轴从1e3到1e15变化。这些是对数图。 Matplotlib自动以1e2步长显示带有刻度线的那些,而我想改为以10为步长(以便能够正确使用次要标记)。

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

如何克服此问题而不手动构建阵列?

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

谢谢。

4 个答案:

答案 0 :(得分:6)

尝试以{p>中的logspace中的NumPy

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 :(得分:1)

您也可以这样做:

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

小数点很重要,因为没有小数点,您将溢出默认的int32 dtype(整数)

答案 2 :(得分: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

答案 3 :(得分:0)

在这种情况下,numpy中的函数extension UIToolbar { func hideBottomHairline() { self.hairlineImageView?.isHidden = true } func showBottomHairline() { self.hairlineImageView?.isHidden = false } } 更合适。 该示例的答案是 logspace