Можно ли установить dtype для существующего структурированного массива или добавить «имя столбца» в существующий массив? - PullRequest
1 голос
/ 08 октября 2019

этот код (фрагмент_1) предназначен для построения структурированного массива

>>> dt = np.dtype([('name', np.str_, 16), ('age', np.int)])
>>> x = np.array([('Sarah', 16), ('John', 17)], dtype=dt)
>>> x
array([('Sarah', 16), ('John', 17)],
      dtype=[('name', '<U16'), ('age', '<i8')])

этот код предназначен для установки типа dtype для данного простого массива

arr = np.array([10, 20, 30, 40, 50]) 
arr = arr.astype('float64') 

thiscode (snippet_3) пытается установить dtype в структурированный массив,

x = np.array([('Sarah', 16), ('John', 17)])
x = x.astype(dt)

, конечно, установка dtype таким образом вызывает ValueError

ValueError                                Traceback (most recent call last)
<ipython-input-18-201b69204e82> in <module>()
      1 x = np.array([('Sarah', 16), ('John', 17)])
----> 2 x = x.astype(dt)

ValueError: invalid literal for int() with base 10: 'Sarah'

Возможно ли установить dtype для существующегоструктурированный массив? что-то вроде сниппета_3?

Зачем мне это делать? Потому что в настройке snippet_1 есть удобный подход для доступа к данным.

x['name']

Если бы я мог добавить «имя столбца» в существующий массив, это было бы круто.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы можете использовать numpy.lib.recfunctions.unstructured_to_structured

x = np.array([('Sarah', 16), ('John', 17)])
x
# array([['Sarah', '16'],
#        ['John', '17']], dtype='<U5')
dt = np.dtype([('name', np.str_, 16), ('age', np.int)])

import numpy.lib.recfunctions as nlr

xs = nlr.unstructured_to_structured(x, dtype=dt)
xs
# array([('Sarah', 16), ('John', 17)],
#       dtype=[('name', '<U16'), ('age', '<i8')])
0 голосов
/ 08 октября 2019

С учетом следующего ввода:

dt = np.dtype([('name', np.str_, 16), ('age', np.int)])
x = np.array([('Sarah', 16), ('John', 17)], dtype=dt)

# array([('Sarah', 16), ('John', 17)],
#      dtype=[('name', '<U16'), ('age', '<i8')])

Давайте добавим столбец к структурированному массиву, например:

new_dt = np.dtype(x.dtype.descr + [('weight', float)])
xx = np.zeros(x.shape, dtype=new_dt)

xx['name'] = x['name']
xx['age'] = x['age']

xx['weight'] = [86.7, 78.9]

и получим:

# array([('Sarah', 16, 86.7), ('John', 17, 78.9)],
#      dtype=[('name', '<U16'), ('age', '<i8'), ('weight', '<f8')])

Чтобы изменить тип данных в структурированном массиве, вместо этого посмотрите на ответ @ PaulPanzer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...