2011-08-12 20 views
9

Basit bir soru hakkında numpy:numpy adlı sütunlar

Ben bir vektör a-100 değerleri yükleyin. Bu vektörden, bir kolonun "C1" ve ikinci bir "C2", bir tane int32 ve bir başka int64 olduğu 2 sütunlu bir dizi A oluşturmak istiyorum. Bir örnek: Ben a gelen dizi oluştururken

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
# A.dtype = ...? 

nasıl kolon'durumuna türleri ve isimleri tanımlamak için?

+0

En iyi seçeneğiniz diziyi (aslında 2) ve bir ad listesini kapsayıcı sınıfına sarmak ve kullanmaktır. – Keith

+0

@Keith: Belli bir sınıfı mı kastediyorsunuz (numpy'de yeniyim)? –

+0

Hayır, yarattığınız kişi. Ardından işlemleri yeni sınıfınızda tanımladığınız yöntemlerden dizilerinize aktarırsınız. Ayrıca, dizilerinizi üstbilgilerle güzel yazdırmak için bir '__str__' yöntemi tanımlayın. – Keith

cevap

9

Numpy yapılandırılmış diziler adında var sütunlar:

import numpy as np 

a=range(100) 
A = np.array(zip(*[iter(a)]*2),dtype=[('C1','int32'),('C2','int64')]) 
print(A.dtype) 
# [('C1', '<i4'), ('C2', '<i8')] 

Böyle adıyla sütunları erişebilirsiniz:

print(A['C1']) 
# [ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 
# 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98] 

Not zip ile np.array kullanarak geçici bir dizi oluşturmak için numpy neden olduğunu tupl listesi. Python listelerinin listesi, eşdeğer NumPy dizilerinden çok daha fazla bellek kullanır. Yani diziniz çok büyükse, zip'u kullanmak istemeyebilirsiniz.

Bunun yerine, NumPy dizisi A, sen A bir 1D dizi yapmak için ravel() kullanın ve sonra yapısal bir diziye çevirmek için view kullanın ve daha sonra istenen türüne sütunlar dönüştürmek için astype kullanabilirsiniz verilen:

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
A = A.ravel().view([('col1','i8'),('col2','i8'),]).astype([('col1','i4'),('col2','i8'),]) 
print(A[:5]) 
# array([(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)], 
#  dtype=[('col1', '<i4'), ('col2', '<i8')]) 

print(A.dtype) 
# dtype([('col1', '<i4'), ('col2', '<i8')]) 
+0

Haklısınız. http://docs.scipy.org/doc/numpy-1.4.x/reference/arrays.dtypes.html –

7

Bu eski bir soru olduğunu biliyorum ama bir daha yakın zamanda seçenek pandas kullanarak çalışmak olacaktı. DataFrame tipi, sütunların adlandırıldığı ve farklı türlerde olabileceği, bu şekilde yapılandırılmış veriler için tasarlanmıştır.