2011-10-29 11 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')]) 

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

答えて

2

Q1:両方np.arraynp.astypeアプローチボンネット下と同じ方法で同じ作業を行います。 np.astypeを使用すると、入力が少し少なくなります。データ型を変更することが意図されていることが読者にはっきりしています。

+0

ありがとうございました! PythonのZenを考えると、それは驚くべきことです...「それを行うには、1つしかなく、好ましくは1つの明白な方法が必要です。」私がポイントを増やすと、私は戻ってupvoteになります... – hatmatrix

関連する問題