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

20 投票
5 回答
38935 浏览
提问于 2025-04-16 09:13

我正在使用numpy.genfromtxt读取一个文件,这个文件里有字符串和数字的列。我需要做的一件事是检测输入的长度。如果每个数组里有多个值,这一切都没问题。

但是……如果结果数组里只有一个元素,逻辑就出错了。我可以在这里举个例子:

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

len(a)会返回一个错误,提示:

TypeError: len() of unsized object

不过,如果a里有两个或更多的元素,len()就会像我们预期的那样工作。

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

len(a)返回2

我担心的是,如果我使用一些奇怪的异常处理,我就无法区分a是空的还是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维数组。

5 个回答

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

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维数组。

撰写回答