2016-11-01 3 views
2

Дано: Numpy массива, созданного из строки:Использование строк в формате Numpy массив

xy = np.array('4.9 3.5; 5.1 3.2; 4.7 3.1; 4.6 3.0; 5.0 5.4') 

Во-первых: существует ли определенный имя для этой конструкции?

Вот тип данных:

In [25]: xy 
Out[25]: 
array('4.9 3.5; 5.1 3.2; 4.7 3.1; 4.6 3.0; 5.0 5.4', 
     dtype='|S43') 

Что является|S43 ..

Так достаточно хорошо с внутренностей .. Так вот реальный вопрос: как мы использовать в сгенерированный массив:

In [31]: cov(xy) 

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-31-6d999a60c1da> in <module>() 
----> 1 cov(xy) 

    .. 
TypeError: cannot perform reduce with flexible type 

Это результат контрастирует с более стандартным использованием np.array:

In [33]: xy = np.array([[4.9, 3.5],[5.1, 3.2],[ 4.7, 3.1],[ 4.6, 3.0],[ 5.0, 5.4]], dtype=float) 

In [35]: cov(xy) 
Out[35]: 
array([[ 0.98 , 1.33 , 1.12 , 1.12 , -0.28 ], 
     [ 1.33 , 1.805, 1.52 , 1.52 , -0.38 ], 
     [ 1.12 , 1.52 , 1.28 , 1.28 , -0.32 ], 
     [ 1.12 , 1.52 , 1.28 , 1.28 , -0.32 ], 
     [-0.28 , -0.38 , -0.32 , -0.32 , 0.08 ]]) 

Итак .. как использовать строковой numpy.array синтаксис, чтобы получить тот же результат?

Обновление My bad here: Я смешивал numpy.array с numpy.matrix. Последний делает поддерживает строгий синтаксис. См. Мой ответ ниже.

+0

Параметр '| S43' означает, что ваш тип является строка с 43 символов – Dekel

+0

' DTYPE = '| S43'' указывает на то, что массив является 'string' массив длины' 43' (она имеет 43 символов) , Другими словами, он хранит все как строку, а не как числа. – James

+0

Вы не можете вычислить ковариацию строки. Вы должны использовать числа (int, float ...) для вычисления. –

ответ

1

Проблема: Я смешал numpy.array с numpy.matrix.

In [47]: np.matrix('1 2 3; 4 5 6') 
Out[47]: 
matrix([[1, 2, 3], 
     [4, 5, 6]]) 
+0

Да, этот стиль ввода был добавлен в 'np.matrix', чтобы дать пользователям MATLAB что-то знакомое. Добавьте '.A', чтобы создать массив. Конечно, это полезно только для игрушечных примеров. – hpaulj

0

Вам необходимо разобрать строку в удобном для использования формате до, переходя на numpy.array. Попробуйте следующее:

# original string 
xy_str = '4.9 3.5; 5.1 3.2; 4.7 3.1; 4.6 3.0; 5.0 5.4' 

# break into nested lists, pass to numpy.array 
xy = numpy.array([list(map(float, v.split())) for v in xy_str.split('; ')]) 
0

Преобразуйте строку в список списков, например, что находится в вашем правильном примере.

orig_xy_str = '4.9 3.5; 5.1 3.2; 4.7 3.1; 4.6 3.0; 5.0 5.4' 
new_xy = np.array([vals.split(' ') for vals in orig_xy_string.split('; ')], dtype=float) 

>>> np.cov(new_xy) 
array([[ 0.98 , 1.33 , 1.12 , 1.12 , -0.28 ], 
     [ 1.33 , 1.805, 1.52 , 1.52 , -0.38 ], 
     [ 1.12 , 1.52 , 1.28 , 1.28 , -0.32 ], 
     [ 1.12 , 1.52 , 1.28 , 1.28 , -0.32 ], 
     [-0.28 , -0.38 , -0.32 , -0.32 , 0.08 ]]) 

Если вы не имеете никакого контроля над начальным входом (как вы говорите, «дали Numpy массив, созданный из строки»), необходимо сначала преобразовать массив в строку с orig_xy_str = str(xy)