如何检测只有一个元素的numpy数组的长度?

20

我正在使用numpy.genfromtxt读取文件,其中包含字符串和数值列。 我需要做的一件事是检测输入的长度。如果每个数组中只读入一个值,则会出现问题。

但是...如果结果数组中只有一个元素,则逻辑会失效。 我可以在此处重新创建一个示例:

import numpy as np
a = np.array(2.3)

len(a)返回一个错误,该错误信息如下:

TypeError: len() of unsized object

然而,如果a有2个或更多元素,len()将按照我们预期的方式运行。

import numpy as np
a = np.array([2.3,3.6])

len(a)返回2。

我的担忧在于,如果我使用某些奇怪的异常处理方式,我无法区分a是空的还是长度等于1。

编辑:@noskio建议将a设置为np.array([2.3])。问题在于,a的实际起源是使用numpy.genfromtxt。代码如下:

import numpy as np
indata = np.genfromtxt(some_filename, names=True,dtype=None)
a = indata['one_col_headername']

因此,如果indata在文件中只有一行,则a是一个0维数组。


1
array([2]) 是一个具有一个元素和一维的数组。array(2) 是一个零秩或零维度的数组。 - endolith
5个回答

39
如果你需要一个一行代码的解决方案(假设你期望的答案是1):
In [1]: import numpy as np

In [2]: a = np.array(2.3)

In [3]: len(np.atleast_1d(a))
Out[3]: 1

这个页面解释了为什么决定在numpy中实现0维数组。


2
@wim 看起来链接已经被删除了,我找不到替代品。 - pberkes

6
import numpy as np

tests=[np.array(2.3),np.array([]),np.array([2.3]),np.array([2.3,3.6])]

print('{a:30}{s:<10}{l:<10}{sl:<10}'.format(a='repr',s='shape',sl='len(shape)',l='length'))
for a in tests:
    s=a.shape
    l=len(a) if a.shape else 0
    sl=len(s)
    print('{a!r:30}{s:<10}{l:<10}{sl:<10}'.format(a=a,l=l,s=s,sl=sl))

产量
repr                          shape     length    len(shape)
array(2.2999999999999998)     ()        0         0         
array([], dtype=float64)      (0,)      0         1         
array([ 2.3])                 (1,)      1         1         
array([ 2.3,  3.6])           (2,)      2         1        

您可以通过查看形状的长度来区分“空”数组(例如np.array([]))和numpy标量(例如np.array(2.3))。

谢谢@unubtu。这很酷,但我如何区分长度为1的'a'和空'a'? - mishaF

3

如果你知道数组是一维的,那么ndarrays的size属性在此情况下可用。在我看来,a.sizelen(np.atleast_1d(a))更易读。但是,请注意,如果数组有多个维度,size属性将返回数组中所有元素的数量:

In [1]: import numpy as np

In [2]: np.array(2.3).size
Out[2]: 1

In [3]: np.array([1, 2]).size
Out[3]: 2

In [4]: np.array([[1,2], [3,4]]).size
Out[4]: 4

0
a = np.array([2.3])
print len(a)

这适用于常量,如您所示,但不适用于数组输入。 - ecoe

0
遇到了同样的问题,我找到了一个简单的方法来区分mishaF和leoschet提到的两种用例。
    import numpy as np
    array_1=np.array(2.3) #not in a list
    array_2=np.array([2.3]) #in a list of len 1
    print(len(array_1)) #gives the type error mentioned in the question
    print(len(array_2)) #returns 1 as desired

1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接