Numpy数组错误设置带序列的数组元素

时间:2018-05-31 18:03:14

标签: python arrays numpy

我尝试使用多列表来保存来自html的抓取数据

但是在50.000列表追加后我得到了内存错误

所以我决定将列表更改为numpy数组

SapList= []
ListAll  =  np.array([])

def eachshop(): #filling each list for each shop data
    global ListAll
    SapList.append(RowNum)
    SapList.extend([sap]) # here can be from one to 10 values in one list["sap1","sap2","sap3",...,"sap10"]
    SapList.extend([[strLink,ProdName],ProdCode,ProdH,NewPrice, OldPrice,[FileName+'#Komp!A1',KompPrice],[FileName+'#Sav!A1','Sav']])
    SapList.extend([ss]) # here can be from null to 80 sublist with 3 values [["id1", "link", "address"],["id80", "link", "address"]]


    ListAll = np.append(np.array(SapList))

然后我做print(ListAll)我得到例外C:\Python36\scrap.py, LINE 307 "ListAll = np.append(np.array(SapList))"): setting an array element with a sequence

现在为了加速我使用pool.map

def makePool(cP, func, iters):
    try:

        pool = ThreadPool(cP)
        #perebiraem Url
        pool.map_async(func,enumerate(iters, start=2)).get(99999)
        pool.close()
        pool.join()
    except:
        print('Pool Error')
        raise
    finally:
        pool.terminate()

那么如何在我的例子中使用numpy数组并使用Numpy减少内存使用和加速I \ O操作?

2 个答案:

答案 0 :(得分:5)

看起来您正在尝试从包含数字和列表的列表中创建数组。类似的东西:

In [6]: np.array([1, [1,2],[3,4]])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-6-812a9ccb6ca0> in <module>()
----> 1 np.array([1, [1,2],[3,4]])

ValueError: setting an array element with a sequence.

如果列表的所有元素

,它确实有效
In [7]: np.array([[1], [1,2],[3,4,5]])
Out[7]: array([list([1]), list([1, 2]), list([3, 4, 5])], dtype=object)

但如果它们的长度不同,则结果是对象数组,而不是2d数字数组。这样的对象dtype数组非常像列表列表,包含指向内存中其他地方列表的指针。

多维数字数组可以使用比列表列表更少的内存,但如果您需要先创建列表,它将无法提供帮助。如果子列表的大小不同,它根本没有帮助。

哦,远离np.append。它的邪恶。另外你误用了它!

答案 1 :(得分:1)

正如hpaulj已经指出的那样,numpy数组在这里没有帮助,因为你没有一致的数据大小。

正如Spinor8建议的那样,将数据转储到其间:

AllList = []
limit = 10000
counter = 0
while not finished:
    if counter >= limit:
        print AllList
        AllList = []
    item = CreateYourList(...)
    AllList.append(item)
    counter += 1

编辑:由于你的问题是专门询问numpy而你甚至打开了赏金:numpy 会帮助你,这就是原因:

  • 为了有效地使用numpy,你必须知道数组创建时的数组大小。 numpy.array.append()实际上并没有附加任何内容,而是创建了一个 new 数组,这对于大型数组来说是一个巨大的开销。
  • 如果所有项目具有相同数量的元素,则Numpy数组效果最佳。具体来说,您可以将矩阵视为矩阵:所有行都具有相同的列数。
  • 您可以根据数据流中最大的元素创建一个numpy数组,但这意味着您需要分配不需要的内存(永远不会填充的数组元素)。这显然无法解决您的记忆问题。

所以恕我直言,解决这个问题的唯一方法就是将你的流分成你的记忆可以处理的块,然后将它拼接在一起。也许将它写入(临时)文件并附加到它?