2014-05-13 19 views
7

Nếu b là 2x2 np.ndarray và phép gán sau được thực hiện, thì làm gì trong nền, nghĩa là chuyển đổi danh sách [100, 100] trước tiên thành mảng có nhiều mảng hoặc nó trực tiếp sử dụng danh sách [100.100] để điền vào các giá trị trong hàng đầu tiên của b:gán mảng numpy bằng cách sử dụng slicing

b[1,:] = [100,100] 

ở đâu trong tài liệu tôi có thể tìm thêm thông tin về vấn đề này?

+0

'numpy' là mã nguồn mở, nếu bạn quan tâm đến cách một cái gì đó được thực hiện * * chỉ cần nhìn vào các nguồn. – Bakuriu

+2

Câu trả lời là "nó phụ thuộc". Tìm trong 'core/src/multiarray/sequence.c' trong phân phối Numpy (' array_assign_slice': https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/sequence.c#L91). Trong ví dụ của bạn, tôi nghĩ rằng mã sẽ không chuyển đổi danh sách thành một mảng, nhưng tùy thuộc vào các trường hợp khác, nó có thể. –

+0

@goncalopp yes i am lo ngại về việc sử dụng bộ nhớ. – methane

Trả lời

-2

b[1,:] = [100,100] là chính xác giống như

b[1,0] = 100 
b[1,1] = 100 

Nó được tuy nhiên nhanh hơn để thực hiện vì nó sử dụng vòng biên soạn. (Điều thứ hai cần thực hiện chuyển đổi sang darpe ndarray trước khi phân bổ các giá trị).

+0

Đây có phải là tài liệu ở đâu đó không? Nếu vậy, bạn có thể vui lòng cung cấp liên kết đến nơi tài liệu này được ghi lại không? Cảm ơn – dg123

+0

Có, vui lòng cho tôi biết nếu nó ở đâu đó trong tài liệu. Vòng lặp được biên dịch là gì? – methane

+0

Xin chào, Tôi đang nói về sự khác biệt giữa ngôn ngữ diễn giải và ngôn ngữ được biên dịch. Nó được biết rằng Python có thể được thực thi lệnh bằng lệnh, không giống như C hoặc Java được biên dịch. Nó cũng được biết rằng numpy là một loại giao diện làm việc với Python nhưng chạy như một chương trình biên dịch. Một ví dụ về hiệu suất vòng được đưa ra trong câu trả lời sau. – Taha

2

Để đánh giá tốc độ thực thi, chúng tôi sẽ sử dụng thư viện timeit.

import timeit 
import numpy as np 

setup = """ 
import numpy as np 
tmp = np.empty(shape=(1, 100)) 
values = [i for i in xrange(100)] 
""" 

stmt1 = """tmp[0, :] = values""" 
stmt2 = """ 
for i, val in enumerate(values): 
    tmp[0, i] = val 
""" 

time1 = timeit.Timer(setup=setup, stmt=stmt1) 
time2 = timeit.Timer(setup=setup, stmt=stmt2) 

print "numpy way :", time1.timeit(number=100000) 
print "Python way:", time2.timeit(number=100000) 

Bạn có thể kiểm tra điều này và bạn sẽ nhận thấy rằng vòng NumPy là hai lần nhanh hơn:

- numpy way : 0.97758197784423828 
- Python way: 2.1633858680725098 

Đây là bởi vì có một giai đoạn mà các số nguyên trong values (mà là các số nguyên không giới hạn) được chuyển đổi thành nổi 64 bit. Để so sánh chỉ tốc độ của các vòng, việc chuyển đổi loại hình có thể được thực hiện sơ bộ trong thiết lập:

values = np.array([i for i in xrange(100)], dtype=np.float64) 

Dưới đây là những gì tôi thu được:

numpy way : 0.131125926971 
Python way: 2.64055013657 

Chúng tôi nhận thấy rằng vòng NumPy là 20 lần nhanh hơn so với vòng lặp Python.

Bạn sẽ tìm thấy nhiều thông tin nếu bạn tìm kiếm vectorized computations in Python ...

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