Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy和PyTables的浮点异常_Python_Numpy_Hdf5_Pytables - Fatal编程技术网

Python Numpy和PyTables的浮点异常

Python Numpy和PyTables的浮点异常,python,numpy,hdf5,pytables,Python,Numpy,Hdf5,Pytables,我有一个由PyTables生成的相当大的HDF5文件,我正试图在集群上读取它。当我在一个单独的块中阅读时,我遇到了NumPy的问题。我们来举一个例子: HDF5文件中阵列的总形状为 In [13]: data.shape Out[13]: (21933063, 800, 3) 此数组中的每个条目都是一个np.float64 我让每个节点读取大小为(21933063,10,3)的切片。不幸的是,NumPy似乎无法同时读取所有2100万个子片。我尝试按顺序将这些切片划分为10个大小为(219330

我有一个由PyTables生成的相当大的HDF5文件,我正试图在集群上读取它。当我在一个单独的块中阅读时,我遇到了NumPy的问题。我们来举一个例子:

HDF5文件中阵列的总形状为

In [13]: data.shape
Out[13]: (21933063, 800, 3)
此数组中的每个条目都是一个
np.float64

我让每个节点读取大小为
(21933063,10,3)
的切片。不幸的是,NumPy似乎无法同时读取所有2100万个子片。我尝试按顺序将这些切片划分为10个大小为
(2193306,10,3)
的切片,然后使用以下reduce使其正常工作:

In [8]: a = reduce(lambda x,y : np.append(x,y,axis=0), [np.array(data[i*      \
        chunksize: (i+1)*chunksize,:10],dtype=np.float64) for i in xrange(k)])
In [9]:

where
1您以前是否尝试分配这么大的数组(如DaveP所建议的)

这是在32位Python上实现的。 实际上,您需要20e6*800*3*8/1e9=384 GB的内存! 一个浮点64需要8个字节。 您真的需要立即使用整个阵列吗

对不起,没有正确阅读帖子

具有k=8个子片的阵列已经大约有4.1 GB大了。也许这就是问题所在

如果最后一个维度仅使用8而不是10,是否有效

另一个建议是,我将首先尝试调整数组的大小,然后填充它:

a = zeros((4,8,3))
a = resize(a, (8,8,3))
a[4:] = ones((4,8,3))

直接将数据读入numpy数组时会出现什么错误?我建议您预先分配目标阵列,而不是通过附加多个阵列来构建它。
In [12]: a.shape
Out[12]: (17546448, 10, 3)
In [14]: a = np.append(a,np.array(data[8*chunksize:9*chunksize,:10],   \
         dtype=np.float64))
In [15]: a.shape
Out[15]: (592192620,)
In [16]: N.empty((21000000,800,3))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
...
ValueError: array is too big.
a = zeros((4,8,3))
a = resize(a, (8,8,3))
a[4:] = ones((4,8,3))