Как определить длину массива 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)