2010-12-30 5 views
15

Я читаю файл, используя numpy.genfromtxt, который содержит столбцы как строк, так и числовых значений. Одна вещь, которую мне нужно сделать, это определить длину ввода. Все это прекрасно, если в каждый массив считывается более одного значения.Как определить длину массива numpy только с одним элементом?

Но ... если в результирующем массиве есть только один элемент, логика терпит неудачу. Я могу воссоздать здесь пример:

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

LEN (а) возвращает ошибку, говоря:

TypeError: len() of unsized object 

Однако, если есть 2 или более элементов, Len() ведет себя, как и следовало ожидать.

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

LEN (а) возвращает 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'] 

В результате, если входные данные, только одна строки в файле, а является 0-d массив.

+1

'массив ([2])' представляет собой массив с одним элементом и 1 измерение , 'array (2)' - массив с нулевыми рангами или нулями. – endolith

ответ

32

Если вам нужен один вкладыш (предполагая, что ответ вы ожидаете 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 объясняет, почему было принято решение реализовать 0-мерные массивы в NumPy.

+1

Спасибо @pberkes! Это помогает тоннам и решает проблему. – mishaF

+0

Ссылка не работает :( – wim

+2

@wim похоже, что ссылка была удалена, и я не могу найти ее замену. – pberkes

0
a = np.array([2.3]) 
print len(a) 
+0

это работает для постоянной, как вы показываете, но не для ввода массива – ecoe

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)), глядя на длину формы.

+0

Спасибо @unubtu. Это круто, но как я могу различать a с длиной 1 и пустой a? – mishaF

+0

Получил! Это помогает тоннам. – mishaF

3

Похоже, что свойство ndarrays size будет работать в этом случае, если вы знаете, что массив одномерный. По-моему, 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 
Смежные вопросы