2011-10-29 5 views
1

Q1. 다른 데이터 형식으로 열을 다시 작성하는 경우 np.array 또는 np.astype이 선호됩니까? np.astype을 사용하는 예제를 보았지만 원하는 결과 (둘 다 원래 배열의 복사본을 반환)를 반환하는 것처럼 보입니다.구조적/레코드 배열의 dtype 변경

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')]) 

질문 2. 열 이름 바꾸기 : np.array을 호출 할 때 정수 열은 0이되지만 값은 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')]) 

답변

2

Q1 다음 np.arraynp.astype 접근 방식 모두 후드 아래 같은 방법으로 동일한 작업을 수행. np.astype을 사용하면 약간의 타이핑이 필요하며 데이터 유형을 변경하려는 의도가 있음을 독자에게 분명히 알립니다.

+0

고마워요! Python의 Zen을 보면 놀랍습니다. "한 가지 - 가능한 한 분명한 방법이 있어야합니다."내가 더 많은 포인트를 얻었을 때 나는 돌아올 것이고 upvote ... – hatmatrix

관련 문제