Как получить массив с смешанными типами?

1

Я хотел бы создать массив numpy со смешанными типами. Другие вопросы SO, которые я нашел, либо создают массив на основе object либо вложенный массив.

И я не хочу.

Как бы синтаксис выглядел так, чтобы иметь массив numpy с одним str и двумя int?

Это мой настоящий код:

import numpy as np

b = np.empty((0, 3), )
b = np.insert(b, b.shape[0], [[1, 2, 3]], axis=0)
b = np.insert(b, b.shape[0], [[1, 2, 3]], axis=0)

print(b)
print("---")

a = np.empty((0, 3), dtype='S4, int, int')
a = np.insert(a, a.shape[0], ("a", 2, 3), axis=0)
a = np.insert(a, a.shape[0], ("a", 2, 3), axis=0)

print(a)

Выход:

[[1. 2. 3.]
 [1. 2. 3.]]
---
[[(b'a', 2, 3) (b'a', 2, 3) (b'a', 2, 3)]
 [(b'a', 2, 3) (b'a', 2, 3) (b'a', 2, 3)]]

РЕДАКТИРОВАТЬ:

И что мне нужно для массива a:

[["a" 2 3]
 ["a" 2 3]]
  • 2
    Вы пробовали pandas
  • 1
    np.array([('a', 1, 2), ('b', 2, 3)], dtype=np.dtype('S4, int, int'))
Показать ещё 2 комментария
Теги:
numpy

1 ответ

2

Второй массив близок, хотя я бы сделал это с индексированием, а не с вставкой (что медленнее):

In [431]: a = np.zeros(3, dtype='S4, int, int')
In [432]: a[0] = ('a', 2, 3)
In [433]: a[1] = 1
In [434]: a
Out[434]: 
array([(b'a', 2, 3), (b'1', 1, 1), (b'', 0, 0)],
      dtype=[('f0', 'S4'), ('f1', '<i8'), ('f2', '<i8')])

Список кортежей также является хорошим способом построения такого массива:

In [436]: a = np.array([('a',2,3),('b',4,5)], dtype='S4, int, int')
In [437]: a
Out[437]: 
array([(b'a', 2, 3), (b'b', 4, 5)],
      dtype=[('f0', 'S4'), ('f1', '<i8'), ('f2', '<i8')])

Обратите внимание, что форма 1d (n,), с 3 полями. Поля не считаются размером.

Поля поступают по имени, а не по столбцу:

In [438]: a['f1']
Out[438]: array([2, 4])

Вы сделали массив (2,3) и наполнили каждую строку одним и тем же. Вот почему у вас есть повторы, а я нет.

С помощью строки unicode dtype (по умолчанию для Py3):

In [439]: a = np.array([('a',2,3),('b',4,5)], dtype='U4, int, int')
In [440]: a
Out[440]: 
array([('a', 2, 3), ('b', 4, 5)],
      dtype=[('f0', '<U4'), ('f1', '<i8'), ('f2', '<i8')])
In [441]: print(a)
[('a', 2, 3) ('b', 4, 5)]
  • 0
    Извините, мой вопрос полностью вводил в заблуждение. Я надеюсь, что теперь все стало понятнее.
  • 0
    Что изменилось Мой ответ дает вам то, что вы хотите, просто заменив «столбцы» на «поля».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню