LINUX.ORG.RU

numpy vectorize — сломал мозг указанием с типа данных

 ,


0

1

Например, у меня есть

table = np.array([n,m],stype=str)
В строках хранятся пары чисел, которые я хочу распарсить функцией
convert: str -> (float,int)
Результирующий массив получаем с помощью
np.vectorize(convert,otypes=$TYPE)(table)
Что нужно указать вместо $TYPE ? Судя по документации, он должен сконструировать массив по типу первого возвращённого значения, но для кортежа это не работает.

★★★★★

Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Ну а как ему это указать? Если я использую функцию конвертации str -> (int,float) (или str -> int,float), то vectorize вместо массива с dtype(int,float) возвращает 2 массива, один из int и другой из float.

In [2]: xs = np.arange(10)

In [3]: xs
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [4]: def conv(x): return (x, x**2)

In [5]: np.vectorize(conv)(xs)
Out[5]: 
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81]))
А хочется, соответственно, что бы было
array([(0,0), (1,1), (2,4), ...])
или
array([[0,0], [1,1], [2,4], ...])

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Я может это делаю ректально, и точно код не помню (по памяти) как-то так:

>>> import numpy
>>> a = numpy.zeros(10, dtype = complex)
>>> for i in range(10): a[i] = complex(i, i * 2)
... 
>>> str(a)
'[ 0. +0.j  1. +2.j  2. +4.j  3. +6.j  4. +8.j  5.+10.j  6.+12.j  7.+14.j\n  8.+16.j  9.+18.j]'
Если это не подходит, то сорян. Хотя два числа парой - первая мысль: комплексное число.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от thunar

Ну оно так и должно делать. Один out — в вектор, два — в два. Не шибко красиво, но можно так:

array(list(zip(*(np.vectorize(conv)(xs)))))

anonymous
()

Вообще, почему не loadtxt для конкретно этой задачи?

np.vectorize(conv,signature='(a)->(b,a)')(xs)
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.