2010-09-16 28 views
6

Đoạn sau tạo một "mảng thử nghiệm điển hình", mục đích của mảng này là để thử nghiệm một loại của sự vật trong chương trình của tôi. Có cách nào hay thậm chí có thể thay đổi loại phần tử trong một mảng không?định dtype của từng đối tượng trong một mảng python 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 

Trả lời

8

Cách để thực hiện việc này bằng cách gọn gàng là sử dụng structured array.

Tuy nhiên, trong nhiều trường hợp bạn đang sử dụng dữ liệu không đồng nhất, danh sách trăn đơn giản là một sự lựa chọn tốt hơn là nhiều hơn. (Hoặc, mặc dù nó không có sẵn rộng rãi khi câu trả lời này được viết, một pandas.DataFrame là hoàn toàn lý tưởng cho trường hợp này.)

Bất kể, ví dụ bạn đưa ra ở trên sẽ hoạt động hoàn hảo như một mảng "bình thường". Bạn chỉ có thể làm mọi thứ nổi trong ví dụ bạn đã đưa ra. (Tất cả mọi thứ dường như là một int, ngoại trừ hai cột phao ... Các bools có thể dễ dàng được biểu diễn như ints.)

Tuy nhiên, để minh họa sử dụng dtypes có cấu trúc ...

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 

Những sản lượng mảng 100 phần tử có 11 trường:

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

Trích dẫn dòng đầu tiên của chương 1 của the NumPy reference:

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

Vì vậy, mỗi thành viên của mảng phải là cùng loại. Việc mất tính tổng quát ở đây, so với các danh sách Python thông thường, là sự cân bằng cho phép các hoạt động tốc độ cao trên các mảng: các vòng lặp có thể chạy mà không kiểm tra loại của mỗi thành viên.

+0

có cách nào khác để sử dụng tệp np.array không? – dassouki

+1

Chính xác thì bạn đang cố gắng làm gì? Tôi nghĩ về việc gumpy như tăng tốc độ toán học: nhân ma trận, hoặc lấy cosin của một bó toàn bộ đầu vào. Nếu không biết nhiều hơn về những gì bạn đang làm, tất cả những gì tôi có thể gợi ý là một danh sách Python thông thường. – mtrw

Các vấn đề liên quan