【问题标题】:How detect length of a numpy array with only one element?如何检测只有一个元素的 numpy 数组的长度?
【发布时间】:2010-12-30 19:48:36
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • array([2]) 是一个元素一维的数组。 array(2) 是一个零秩或零维度的数组。

标签: python arrays numpy


【解决方案1】:

如果您需要单线(假设您期望的答案是 1):

In [1]: import numpy as np

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

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

This page 解释了为什么决定在 numpy 中实现 0 维数组。

【讨论】:

  • @wim 看起来链接已被删除,我找不到替代品。
【解决方案2】:
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?
【解决方案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

【讨论】:

    【解决方案4】:
    a = np.array([2.3])
    print len(a)
    

    【讨论】:

    • 这适用于您显示的常量,但不适用于数组输入
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 2022-01-07
    • 2017-01-07
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多