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

mis*_*haF 17 python arrays numpy

我正在使用numpy.genfromtxt读取文件,该文件引入了字符串和数值的列.我需要做的一件事是检测输入的长度.如果每个数组中读取了多个值,则这一切都很好.

但是......如果结果数组中只有一个元素,则逻辑失败.我可以在这里重新创建一个例子:

import numpy as np
a = np.array(2.3)
Run Code Online (Sandbox Code Playgroud)

len(a)返回错误说:

TypeError: len() of unsized object
Run Code Online (Sandbox Code Playgroud)

但是,如果a有2个或更多元素,则len()的行为与预期的一样.

import numpy as np
a = np.array([2.3,3.6])
Run Code Online (Sandbox Code Playgroud)

len(a)返回2

我关注的是,如果我使用一些奇怪的异常处理,我无法区分为空和长度= 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']
Run Code Online (Sandbox Code Playgroud)

因此,如果indata只是文件中的一行,则a是0-d数组.

pbe*_*kes 35

如果你需要一个单行(假设你期望的答案是1):

In [1]: import numpy as np

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

In [3]: len(np.atleast_1d(a))
Out[3]: 1
Run Code Online (Sandbox Code Playgroud)

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

  • @wim看起来链接已被删除,我找不到它的替代品. (2认同)

unu*_*tbu 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))
Run Code Online (Sandbox Code Playgroud)

产量

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        
Run Code Online (Sandbox Code Playgroud)

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