2010-09-16 34 views
6

निम्नलिखित स्निपेट एक "ठेठ परीक्षण सरणी" बनाता है में प्रत्येक वस्तु के dtype निर्दिष्ट करते हैं, इस सरणी के प्रयोजन मेरा कार्यक्रम में चीजों की एक वर्गीकरण परीक्षण करने के लिए है। क्या कोई तरीका है या सरणी में तत्वों के प्रकार को बदलने के लिए भी संभव है?एक अजगर numpy सरणी

import numpy as np 
import random 
from random import uniform, randrange, choice 

# ... bunch of silly code ... 

def gen_test_array(ua, low_inc, med_inc, num_of_vectors): 
    #typical_array = [ zone_id, ua, inc, veh, pop, hh, with_se, is_cbd, re, se=0, oe] 
    typical_array = np.zeros(shape = (num_of_vectors, 11)) 

    for i in range(0, num_of_vectors): 
    typical_array[i] = [i, int(ua), uniform(low_inc/2, med_inc * 2), uniform(0, 6), 
         randrange(100, 5000), randrange(100, 500), 
         choice([True, False]), choice([True, False]), 
         randrange(100, 5000), randrange(100, 5000), 
         randrange(100, 5000) ] 

    return typical_array 

उत्तर

8

numpy में ऐसा करने का तरीका structured array का उपयोग करना है।

हालांकि, कई मामलों में जहां आप विषम डेटा का उपयोग कर रहे हैं, एक साधारण पायथन सूची अधिक बेहतर विकल्प है। (या, हालांकि यह उत्तर लिखे जाने पर व्यापक रूप से उपलब्ध नहीं था, pandas.DataFrame इस परिदृश्य के लिए बिल्कुल आदर्श है।)

भले ही, ऊपर दिया गया उदाहरण पूरी तरह से "सामान्य" numpy सरणी के रूप में काम करेगा। आप जो कुछ भी दिया है उसमें आप सब कुछ एक फ्लोट कर सकते हैं। (सब कुछ ... bools आसानी से ints के रूप में प्रतिनिधित्व किया जा सकता है तैरता के दो स्तंभों के अलावा, किसी पूर्णांक प्रतीत होता है।)

बहरहाल, संरचित dtypes का उपयोग कर वर्णन करने के लिए ...

import numpy as np 

ua = 5 # No idea what "ua" is in your code above... 
low_inc, med_inc = 0.5, 2.0 # Again, no idea what these are... 

num = 100 
num_fields = 11 

# Use more descriptive names than "col1"! I'm just generating the names as placeholders 
dtype = {'names':['col%i'%i for i in range(num_fields)], 
       'formats':2*[np.int] + 2*[np.float] + 2*[np.int] + 2*[np.bool] + 3*[np.int]} 
data = np.zeros(num, dtype=dtype) 

# Being rather verbose... 
data['col0'] = np.arange(num, dtype=np.int) 
data['col1'] = int(ua) * np.ones(num) 
data['col2'] = np.random.uniform(low_inc/2, med_inc * 2, num) 
data['col3'] = np.random.uniform(0, 6, num) 
data['col4'] = np.random.randint(100, 5000, num) 
data['col5'] = np.random.randint(100, 500, num) 
data['col6'] = np.random.randint(0, 2, num).astype(np.bool) 
data['col7'] = np.random.randint(0, 2, num).astype(np.bool) 
data['col8'] = np.random.randint(100, 5000, num) 
data['col9'] = np.random.randint(100, 5000, num) 
data['col10'] = np.random.randint(100, 5000, num) 

print data 

कौन सा पैदावार 11 फ़ील्ड के साथ एक 100-तत्व सरणी:

array([ (0, 5, 2.0886534380436226, 3.0111285613794276, 3476, 117, False, False, 4704, 4372, 4062), 
     (1, 5, 2.0977199579338115, 1.8687472941590277, 4635, 496, True, False, 4079, 4263, 3196), 
     ... 
     ... 
     (98, 5, 1.1682309811443277, 1.4100766819689299, 1213, 135, False, False, 1250, 2534, 1160), 
     (99, 5, 1.746554619056416, 5.210411489007637, 1387, 352, False, False, 3520, 3772, 3249)], 
     dtype=[('col0', '<i8'), ('col1', '<i8'), ('col2', '<f8'), ('col3', '<f8'), ('col4', '<i8'), ('col5', '<i8'), ('col6', '|b1'), ('col7', '|b1'), ('col8', '<i8'), ('col9', '<i8'), ('col10', '<i8')]) 
4

the NumPy reference:

NumPy provides an N-dimensional array type, the ndarray, which describes a collection of “items” of the same type. 

के अध्याय 1 की पहली पंक्ति का हवाला देते हुए तो सरणी के हर सदस्य एक ही प्रकार के हो गया है। यहां नियमित पाइथन सूचियों की तुलना में सामान्यता का नुकसान व्यापार-बंद है जो सरणी पर उच्च गति संचालन की अनुमति देता है: लूप प्रत्येक सदस्य के प्रकार के परीक्षण के बिना चला सकते हैं।

+0

क्या एनपी.एरे का उपयोग करने के कोई विकल्प हैं? – dassouki

+1

आप वास्तव में क्या करने की कोशिश कर रहे हैं? मैं गणित को तेज करने के रूप में numpy के बारे में सोचता हूं: मैट्रिक्स गुणा, या इनपुट के पूरे गुच्छा के कोसाइन ले। आप जो कर रहे हैं उसके बारे में और जानने के बिना, मैं सुझाव दे सकता हूं कि एक नियमित पायथन सूची है। – mtrw

संबंधित मुद्दे