Numpy squeeze - ' list'对象没有属性'挤压'

时间:2018-06-06 23:00:27

标签: python numpy

可以运行以下代码并且不会出错:

[console]::Writeline( "strTestPath                 = {0}{1}" ,
                      $strTestPath , [Environment]::NewLine );
[console]::Writeline( "GetDirectoryName            = {0}" ,
                      [IO.Path]::GetDirectoryName( $strTestPath ) );
[console]::Writeline( "GetFileName                 = {0}" ,
                      [IO.Path]::GetFileName( $strTestPath ) );
[console]::Writeline( "GetExtension                = {0}" ,
                      [IO.Path]::GetExtension( $strTestPath ) );
[console]::Writeline( "GetFileNameWithoutExtension = {0}" ,
                      [IO.Path]::GetFileNameWithoutExtension( $strTestPath ) );

但是跑步:

>>> np.squeeze([''])
array('', dtype='<U1')
>>> np.squeeze([[]])
array([], dtype=float64)

返回以下错误:

>>> np.squeeze(['', []])

为什么会发生这种情况?!

修改

  

什么版本?

  • python == 3.6
  • numpy == 1.14.3
  

为什么要挤出这样的清单?

我使用内部词典来获取同义词和首字母缩略词的引理。有时候,当输入的单词不在我的字典中时,我选择将它作为一个引理,有时候我更喜欢放弃这个词。引理被定义为 n 字的数组。

为了跟踪引理在输入文本中的实际位置,我想在我的返回列表中添加 0 字的引理,一个空列表。乍一看,我认为挤压会自己放下空列表......

2 个答案:

答案 0 :(得分:2)

问题在于,由于缺乏正确定义的维度,您无法将['', []]转换为数组。简单地调用np.array(['', []])导致错误的事实可以看出这一点:

>>> 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数组:

>>> np.squeeze([[''], []])
array([list(['']), list([])], dtype=object)

答案 1 :(得分:2)

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

In [325]: np.array(['', []])
....
ValueError: setting an array element with a sequence

您正在尝试从混合的对象,字符串和列表中创建数组。

In [326]: np.array(['', []],object)
Out[326]: array(['', list([])], dtype=object)

如果你告诉它创建一个对象dtype数组,它可以。

但是没有那个规范,它首先尝试制作字符串dtype数组。但是然后将列表插入字符串槽有问题 - 因此错误。

除了好奇心之外,你为什么要squeeze这样的名单?

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

In [327]: np.array([[],''])
Out[327]: array([list([]), ''], dtype=object)

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

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])

考虑到各种各样的物品,它必须“猜测”你真正想要的东西;有时它会猜错,有时它会放弃。