Как определить длину массива numpy только с одним элементом?

Я читаю файл, используя 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.

EDIT: @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-d.

Ответы

Ответ 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

Эта страница объясняет, почему было принято решение реализовать 0-мерные массивы в numpy.

Ответ 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([])) и числовой скаляр (например, np.array(2.3)), просматривая длину фигуры.

Ответ 3

Похоже, что свойство size ndarrays будет работать в этом случае, если вы знаете, что массив одномерный. На мой взгляд, a.size является более читаемым, чем len(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)