首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Numpy squeeze - 'list‘对象没有'squeeze’属性

Numpy squeeze - 'list‘对象没有'squeeze’属性
EN

Stack Overflow用户
提问于 2018-06-07 07:00:27
回答 2查看 3.4K关注 0票数 2

用户可以运行以下代码,并且不会出现错误:

代码语言:javascript
复制
>>> np.squeeze([''])
array('', dtype='<U1')
>>> np.squeeze([[]])
array([], dtype=float64)

但是正在运行:

代码语言:javascript
复制
>>> np.squeeze(['', []])

返回以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\fromnumeric.py", line 1240, in squeeze
    squeeze = a.squeeze
AttributeError: 'list' object has no attribute 'squeeze'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\fromnumeric.py", line 1242, in squeeze
    return _wrapit(a, 'squeeze')
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\fromnumeric.py", line 42, in _wrapit
    result = getattr(asarray(obj), method)(*args, **kwds)
File "C:\Users\leonardo.schettini\Documents\recrutai\recrutai\testenv\lib\site-packages\numpy\core\numeric.py", line 492, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence

这一切为什么要发生?!

编辑:

是什么版本?

  • python == 3.6
  • numpy == 1.14.3

你为什么要挤这样一个列表呢?

我正在使用内部词典来获取同义词和缩略词的词条。有时,当输入的单词不在我的字典中时,我选择将其作为词条保留,而另一些时候,我更喜欢删除该单词。引理被定义为n个单词的数组。

为了跟踪词条在输入文本中的实际位置,我想在返回列表中添加单词的词条,即一个空列表。乍一看,我以为squeeze会自己删除空列表……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-07 09:06:48

np.squeeze实际上只是a.squeeze()的包装器,它是一种数组方法。你的参数是一个列表,它没有这个方法。因此,该函数尝试从列表中创建一个数组:

代码语言:javascript
复制
In [325]: np.array(['', []])
....
ValueError: setting an array element with a sequence

您正在尝试从对象、字符串和列表的混合中生成一个数组。

代码语言:javascript
复制
In [326]: np.array(['', []],object)
Out[326]: array(['', list([])], dtype=object)

如果你告诉它创建一个对象数据类型数组,它就能做到。

但是如果没有这个规范,它首先会尝试生成字符串数据类型数组。但是在将列表放入字符串槽时出现了问题--因此出现了错误。

除了好奇,你为什么要在squeeze上列出这样一个列表呢?

如果列表是第一个,np.array可以创建一个对象数组:

代码语言:javascript
复制
In [327]: np.array([[],''])
Out[327]: array([list([]), ''], dtype=object)

当给定一个不同大小和/或类型的项目列表时,这只是np.array工作方式的一个怪癖。它的主要任务是从整齐嵌套的数字或字符串列表的列表中生成一个数组。

代码语言:javascript
复制
In [328]: np.array([[1,2,3,4]])
Out[328]: array([[1, 2, 3, 4]])
In [329]: np.squeeze([[1,2,3,4]])
Out[329]: array([1, 2, 3, 4])

给定一个混合的项目,它必须“猜测”你真正想要的是什么;有时它猜错了,有时它放弃了。

票数 3
EN

Stack Overflow用户

发布于 2018-06-07 07:07:48

问题是您无法将['', []]转换为数组,因为缺少正确定义的维数。这可以从简单地调用np.array(['', []])导致错误的事实中看出:

代码语言:javascript
复制
>>> np.array(['', []])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence

docs中,它指出参数输入数据a必须是array_like,而['', []]不是(并不是所有的列表都是array_like)。不幸的是,没有一种非常简单的防故障方法来确定它是否是类似数组的,正如here所解释的那样

通常,在Python中以类似数组的结构排列的数值数据可以通过使用

()函数转换为数组。最明显的例子是列表和元组。有关array()用法的详细信息,请参阅array()的文档。一些对象可能支持数组协议,并允许以这种方式转换为数组。使用array()查看对象是否可以转换为numpy数组的一种简单方法是交互地尝试它,看看它是否有效!( Python方式)。

如果您愿意,您可以这样做:np.squeeze([[''], []]),因为([[''], []])已经正确定义了维数,因此可以转换为numpy数组:

代码语言:javascript
复制
>>> np.squeeze([[''], []])
array([list(['']), list([])], dtype=object)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50730780

复制
相关文章

相似问题

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