изменение типа структурированных / рекордных массивов - PullRequest
2 голосов
/ 30 октября 2011

Q1.При преобразовании столбца в другой тип данных предпочтительным является np.array или np.astype?Я видел примеры использования np.astype, но оба, похоже, возвращают желаемый результат (оба возвращают копии исходного массива).

import numpy as np

## recasting string to integer
x = np.rec.array([('a','1'),('b','2')],names='col1,col2')
##
In []: x
Out[]: 
rec.array([('a', '1'), ('b', '2')], 
      dtype=[('col1', '|S1'), ('col2', '|S1')])
##
dt = x.dtype.descr
dt[1] = (dt[1][0],'int')
## which is more appropriate:
y = np.array(x,dtype=dt)
## or
y = x.astype(dt)
## ?
In []: y
Out[]: 
rec.array([('a', 1), ('b', 2)], 
      dtype=[('col1', '|S1'), ('col2', '<i4')])

Q2.Переименование столбцов: целочисленные столбцы становятся равными нулю при вызове np.array, но сохраняют свои значения с np.rec.array.Зачем?Насколько я понимаю, с первым вы получаете структурированный массив, а второй возвращает массив записей;для большинства целей я думал, что они были одинаковыми.И это поведение удивительно, в любом случае.

## rename 2nd column from col2 to v2
dt = copy.deepcopy(y.dtype)
names = list(dt.names)
names[1] = 'v2'
dt.names = names
## this is not right
newy = np.array(y,dtype=dt)
In []: newy
Out[]: 
array([('a', 0), ('b', 0)], 
      dtype=[('col1', '|S1'), ('v2', '<i4')])
## this is correct
newy = np.rec.array(y,dtype=dt)
In []: newy
Out[]: 
rec.array([('a', 1), ('b', 2)], 
      dtype=[('col1', '|S1'), ('v2', '<i4')])

1 Ответ

3 голосов
/ 30 октября 2011

Q1 : оба подхода np.array и np.astype выполняют одинаковую работу под капотом одинаково.Использование np.astype требует чуть меньше ввода, и читателю становится понятнее, что намерение состоит в том, чтобы изменить тип данных.

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