【问题标题】:How to create a Numpy array from a large list of list- python如何从大量列表中创建 Numpy 数组 - python
【发布时间】:2014-04-23 11:23:58
【问题描述】:

我有一个包含 1,200 行和 500,000 列的列表。如何将其转换为 numpy 数组?

我已阅读 Bypass "Array is too big" python error 上的解决方案,但它们没有帮助。

我尝试将它们放入一个 numpy 数组中:

import random
import numpy as np
lol = [[random.uniform(0,1) for j in range(500000)] for i in range(1200)]
np.array(lol)

[错误]:

ValueError: array is too big.

那我试过pandas:

import random
import pandas as pd
lol = [[random.uniform(0,1) for j in range(500000)] for i in range(1200)]
pd.lib.to_object_array(lol).astype(float)

[错误]:

ValueError: array is too big.

我也按照@askewchan 的建议尝试了 hdf5:

import h5py
filearray = h5py.File('project.data','w')
data = filearray.create_dataset('tocluster',(len(data),len(data[0])),dtype='f')
data[...] = data

[错误]:

    data[...] = data
  File "/usr/lib/python2.7/dist-packages/h5py/_hl/dataset.py", line 367, in __setitem__
    val = numpy.asarray(val, order='C')
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.py", line 460, in asarray
    return array(a, dtype, copy=False, order=order)
  File "/usr/lib/python2.7/dist-packages/h5py/_hl/dataset.py", line 455, in __array__
    arr = numpy.empty(self.shape, dtype=self.dtype if dtype is None else dtype)
ValueError: array is too big.

这篇文章表明我可以在磁盘Python: how to store a numpy multidimensional array in PyTables? 中存储一个巨大的 numpy 数组。但我什至无法将我的列表列表放入一个 numpy 数组 =(

【问题讨论】:

  • 当前列表(列表中的)如何存储?它是在磁盘上,还是在内存中计算?
  • 在内存中计算。
  • 无法重现,即使在 32 位系统上也不应该出现“数组太大”,因为数组并不太大。那么你使用的是什么 numpy 版本?你能用lol = [[0] * 500000] * 1200; a = np.array(lol) 重现它吗(测试时内存效率更高)?
  • Nvm。如果您使用的是 32 位 numpy/python(忘记了项目大小因素),它只是 is 太大了。你应该升级,因为你显然可以使用大量的 RAM,系统很难真正是 32 位的?
  • np.zeros((500000, 1200)) 更简洁有效吗?

标签: python arrays numpy pandas pytables


【解决方案1】:

问题似乎是您使用的 something(操作系统或 python)只有 32 位,这是大小限制的来源。解决办法是升级到64位。

【讨论】:

【解决方案2】:

在具有 32GB RAM 和 64 位 Python 的系统上,您的代码:

import random
import numpy as np
lol = [[random.uniform(0,1) for j in range(500000)] for i in range(1200)]
np.array(lol)

对我来说效果很好,但它可能不是最好的选择。这就是 PyTables 的目标。由于您正在处理同质数据,您可以使用 Array 类,或者更好的是 CArray class(它支持压缩)。这可以按如下方式完成:

import numpy as np
import tables as pt

# Create container
h5 = pt.open_file('myarray.h5', 'w')
filters = pt.Filters(complevel=6, complib='blosc')
carr = h5.create_carray('/', 'carray', atom=pt.Float32Atom(), shape=(1200, 500000), filters=filters)

# Fill the array
m, n = carr.shape
for j in xrange(m):
    carr[j,:] = np.random.randn(n) 

h5.close() # "myarray.h5" (~2.2 GB)

# Open file
h5 = pt.open_file('myarray.h5', 'r')
carr = h5.root.carray
# Display some numbers from array
print carr[973:975, :4]
print carr.dtype    

如果您print carr.flavor,它将返回'numpy'。您可以像使用 NumPy 数组一样使用此 carr。信息存储在磁盘上,但速度仍然很快。

【讨论】:

    【解决方案3】:

    您是否尝试过分配数据类型?这对我有用。

    import random
    import numpy as np
    lol = [[random.uniform(0,1) for j in range(500000)] for i in range(1200)]
    ar = np.array(lol, dtype=np.float64)
    

    另一种选择是使用 blaze。 http://blaze.pydata.org/

    import random
    import blaze
    lol = [[random.uniform(0,1) for j in range(500000)] for i in range(1200)]
    ar = blaze.array(lol)
    

    【讨论】:

    • 你有多少内存?
    【解决方案4】:

    另一种选择如下:

    lol = np.empty((1200,500000))
    for i in range(lol.shape[0]):
        lol[i] = [random.uniform(0,1) for j in range(lol.shape[1])]
    

    这与您的初始形式相当接近,我希望它可以适合您的代码。我无法用你的数字进行测试,因为我没有足够的 RAM 来处理数组。

    【讨论】:

      【解决方案5】:

      h5py / hdf5:

      import numpy as np
      import h5py
      
      lol = np.empty((1200, 5000)).tolist()
      
      f = h5py.File('big.hdf5', 'w')
      bd = f.create_dataset('big_dataset', (len(lol), len(lol[0])), dtype='f')
      bd[...] = lol
      

      那么,我相信你可以像访问数组一样访问你的大数据集bd,但它是从磁盘而不是内存存储和访问的:

      In [14]: bd[0, 1:10]
      Out[14]:
      array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.], dtype=float32)
      

      您可以在一个文件中拥有多个“数据集”(多个数组)。

      abd = f.create_dataset('another_big_dataset', (len(lol), len(lol[0])), dtype='f')
      abd[...] = lol
      abd += 10
      

      然后:

      In [24]: abd[:3, :10]
      Out[24]: 
      array([[ 10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.],
             [ 10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.],
             [ 10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.,  10.]], dtype=float32)
      
      In [25]: bd[:3, :10]
      Out[25]: 
      array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
             [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
             [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)
      

      我的计算机无法处理您的示例,因此我无法使用您的大小的数组对此进行测试,但我希望它可以工作!

      根据您想对数组执行的操作,pytables 可能比 h5py 做得更多。

      另请参阅:
      Python Numpy Very Large Matrices
      exporting from/importing to numpy, scipy in SQLite and HDF5 formats

      【讨论】:

      • 太糟糕了,对于 numpy 来说还是太大了
      • 我不明白。这不会生成一个 numpy 数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2011-07-08
      • 2011-01-07
      • 2021-11-22
      • 1970-01-01
      • 2016-03-03
      相关资源
      最近更新 更多