首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用序列设置数组元素时出现Numpy数组错误

使用序列设置数组元素时出现Numpy数组错误
EN

Stack Overflow用户
提问于 2018-06-01 02:03:14
回答 2查看 142关注 0票数 2

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

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

所以我决定把列表改成numpy数组

代码语言:javascript
复制
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

代码语言:javascript
复制
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操作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-04 06:09:13

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

正如Spinor8建议的那样,转储中间的数据:

代码语言:javascript
复制
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()实际上不会追加任何东西,但会创建一个新数组,这对于大型数组来说是一个巨大的开销。如果所有项都有相同数量的元素,则
  • Numpy数组的工作效果最好。具体地说,你可以把一个numpy数组想象成一个矩阵:所有的行都有相同的列数。
  • 你可以根据数据流中最大的元素创建一个numpy数组,但这意味着你分配了不需要的内存(永远不会填满的数组元素)。这显然不会解决你的内存问题。

所以,我想,你解决这个问题的唯一方法是把你的流分解成你的内存可以处理的块,然后再把它缝在一起。也许可以把它写到一个(临时)文件中,然后附加到它上面?

票数 1
EN

Stack Overflow用户

发布于 2018-06-01 02:46:03

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

代码语言:javascript
复制
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.

如果列表的所有元素都有效

代码语言:javascript
复制
In [7]: np.array([[1], [1,2],[3,4,5]])
Out[7]: array([list([1]), list([1, 2]), list([3, 4, 5])], dtype=object)

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

多维数字数组可以使用比列表列表更少的内存,但是如果您需要首先创建列表,那么它不会有任何帮助。而且,如果子列表的大小不同,也没有任何帮助。

哦还有离np.append远点。这是邪恶的而且你误用了它!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50630280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档