【问题标题】:Numpy array error setting an array element with a sequenceNumpy数组错误使用序列设置数组元素
【发布时间】:2018-11-10 19:40:36
【问题描述】:

我尝试使用多列表来保存从 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 操作?

【问题讨论】:

  • 如果你想要一个可以追加行的数组,你需要一个二维数组,而不是一维数组。
  • 另外,ListAll = np.append(np.array(SapList)) 应该做什么?它显然不会在ListAll 上附加任何内容,它只会在从SapList 创建的临时数组上调用append,然后将结果存储在ListAll 中,替换过去的任何内容。我很确定这不是你想要的,但我不确定你确实想要什么,所以我无法告诉你如何解决它。
  • 我认为ListAll = np.append(np.array(SapList))ListAll.append([SapList]) 相同
  • 不,它们甚至完全不一样。后者在ListAll 上调用append 方法。前者在np 模块上调用append 函数,甚至不将ListAll 传递给它,然后将结果分配给ListAll
  • 考虑每 10k 转储一次结果,而不是等待它在 50k 条目时耗尽内存。

标签: python arrays numpy


【解决方案1】:

您似乎正在尝试从包含数字和列表的列表中创建一个数组。比如:

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)

但如果它们的长度不同,则结果是对象数组,而不是二维数值数组。这样的对象 dtype 数组非常类似于列表列表,包含指向内存中其他位置的列表的指针。

与列表列表相比,多维数值数组可以使用更少的内存,但如果您需要先创建列表,这将无济于事。如果子列表的大小不同,这根本没有帮助。

哦,远离np.append。这是邪恶的。再加上你误用了它!

【讨论】:

  • 是的,子列表的大小总是不同的
【解决方案2】:

作为hpaulj指出,numpy 987654321 @阵列在这里没有帮助,因为您没有一致的数据大小。

作为spinor8建议,转储之间的数据,而不是:

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

编辑:由于您的问题特别询问numpy,并且您甚至打开了赏金:numpy是 not em>要帮助您,这就是为什么: P>

  • 有效地使用Numpy,您必须在阵列创建时知道数组大小。 numpy.array.append() @实际上没有追加任何内容,而是创建一个 new em>数组,这是一个巨大的阵列开销。
  • NUMPY阵列最佳,如果所有项目都具有相同数量的元素。具体来说,您可以考虑一个像矩阵一样的numpy数组:所有行都具有相同数量的列。
  • 您可以基于数据流中的最大元素创建Numpy数组,但这意味着您将分配您不需要的内存(从未填充的数组元素)。这显然不会解决您的记忆问题。

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

【讨论】:

  • 列号始终相同。只不同于此列和行计数的信息。它是从网站刮掉的产品 span>
  • 您的数据比简单的矩阵更复杂,它的多维矩阵,它并不总是相同的(由您的代码和您的cmets判断) span>
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多