[英]Why pylint returns `unsubscriptable-object` for numpy.ndarray.shape?
[英]Python Numpy.ndarray.shape limit
我想用Python在Numpy中创建一个矩阵,代码如下:
import numpy
result=numpy.zeros((20,20,20,30,30,30))
numpy.save('result',result)
我收到以下错误:
Traceback (most recent call last):
File "numpy_memoryerror.py",
line 5, in <module>
result=numpy.zeros((20,20,20,30,30,30))
MemoryError
如果我使用这样的较小尺寸:
result=numpy.ones((10,10,10,20,20,20))
然后代码工作。
有人能告诉我形状元组的限制吗?
它不是形状元组的基本限制,它是你的系统上没有足够的内存(RAM),因此是MemoryError
。
20 * 20 * 20 * 30 * 30 * 30再次是2.16亿64位(8字节)浮点数或略高于1.6 GB的RAM。 那么在此时运行脚本时你有1.6 GB的RAM吗? (不要忘记python,操作系统,其他正在运行的程序等使用的所有RAM)。 如果您使用的是linux / unix,则可以通过在命令提示符下键入free -m
来查看可用内存量。 在Windows中,您可以通过转到任务管理器查看可用内存。 此外,一些操作系统限制单个进程(如python)可以分配的内存量; 例如,32位窗口每个进程仅提供2 GB的地址空间。
将其与20 * 20 * 20 * 10 * 10 * 10进行比较,仅为~0.06 GB(或仅减少27倍的内存)。
如果你不需要8字节浮点数,你可以这样做
numpy.zeros(20,20,20,30,30,30, dtype='float32')
这将通过使用单精度(32位)浮点数减半您的内存占用。 默认情况下,numpy使用dtype ='float64'。
粗略地说,32位浮点数具有8位精度,64位浮点数具有16位精度。 意味着1 + 1e-8在32位浮点数时仅显示1,而1 + 1e-16在64位浮点数时显示为1,但1 + 1e-15显示为1.000000000000001与64位浮点数,但不是32比特浮动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.