Как хранить по столбцам в структурированном массиве NumPy - PullRequest
0 голосов
/ 05 июня 2018

У меня есть список кортежей, которые выглядят так:

>>> y
[(0,1,2,3,4,...,10000), ('a', 'b', 'c', 'd', ...), (3.2, 4.1, 9.2, 12., ...), ]

и т. Д.y имеет 7 кортежей, где каждый кортеж имеет 10000 значений.Все 10000 значений данного кортежа имеют один и тот же тип dtype, и у меня есть список этих типов:

>>>dt
[('0', dtype('int64')), ('1', dtype('<U')), ('2', dtype('<U')), ('3', dtype('int64')), ('4', dtype('<U')), ('5', dtype('float64')), ('6', dtype('<U'))]

Я собираюсь сделать что-то вроде x = np.array(y, dtype=dt), но когда я это сделаю, яполучить следующую ошибку:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not assign tuple of length 10000 to structure with 7 fields.

Я понимаю, что это потому, что dtype говорит, что первое значение в кортеже должно быть int64, второе значение должно быть строкой, и так далее, и что ятолько 7 типов для кортежа с 10 000 значений.

Как я могу сообщить коду, что я имею в виду, что ALL значения первого кортежа являются int64s, а ALL значениями второго кортежа являются строки и т. д .?

Я также пытался сделать y списком списков вместо списка кортежей:

>>>y
[[0,1,2,3,4,...,10000], ['a', 'b', 'c', 'd', ...), ...] 

и т. д.,и я получаю сообщение об ошибке по той же причине, что и выше:

>>> x = np.array(y, dtype=dt)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Supplier#000000001'

Любая помощь приветствуется!

Редактировать: Моя цель состоит в том, чтобы x был пустым массивом.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Используйте идиому zip*, чтобы «транспонировать» ваш список кортежей:

In [150]: alist = [(0,1,2,3,4),tuple('abcde'),(.1,.2,.4,.6,.8)]
In [151]: alist
Out[151]: [(0, 1, 2, 3, 4), ('a', 'b', 'c', 'd', 'e'), (0.1, 0.2, 0.4, 0.6, 0.8)]
In [152]: dt = np.dtype([('0',int),('1','U3'),('2',float)])


In [153]: list(zip(*alist))
Out[153]: [(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6), (4, 'e', 0.8)]
In [154]: np.array(_, dt)
Out[154]: 
array([(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6),
       (4, 'e', 0.8)], dtype=[('0', '<i8'), ('1', '<U3'), ('2', '<f8')])

Существует также создатель recarray, который принимает список массивов:

In [160]: np.rec.fromarrays(alist,dtype=dt)
Out[160]: 
rec.array([(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6),
           (4, 'e', 0.8)],
          dtype=[('0', '<i8'), ('1', '<U3'), ('2', '<f8')])

Существует также модуль numpy.lib.recfunctions (импорт отдельно), который имеет функции recarray, structured array.


Как прокомментировано:

In [169]: np.fromiter(zip(*alist),dt)
Out[169]: 
array([(0, 'a', 0.1), (1, 'b', 0.2), (2, 'c', 0.4), (3, 'd', 0.6),
       (4, 'e', 0.8)], dtype=[('0', '<i8'), ('1', '<U3'), ('2', '<f8')])
0 голосов
/ 05 июня 2018

Вероятно, не самое элегантное решение, но работает понимание списка:

x = [np.array(tup, dtype=typ[1]) for tup, typ in zip(y, dt)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...