Как определить длину массива с одним элементом? - PullRequest
16 голосов
/ 30 декабря 2010

Я читаю в файле, используя 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]). Проблема в том, что фактическое происхождение а заключается в использовании numpy.genfromtxt. Код выглядит так:

import numpy as np
indata = np.genfromtxt(some_filename, names=True,dtype=None)
a = indata['one_col_headername']

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

Ответы [ 4 ]

34 голосов
/ 30 декабря 2010

Если вам нужен однострочный (при условии, что вы ожидаете получить ответ 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.

6 голосов
/ 30 декабря 2010
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 голосов
/ 05 марта 2014

Похоже, что свойство 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
0 голосов
/ 30 декабря 2010
a = np.array([2.3])
print len(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...