Lời khuyên cho việc chơi golf với numpy, scipy hoặc pylab


10

Có đã là một danh sách đầy đủ các lời khuyên cho python đây , vì vậy những gì tôi yêu cầu cho những lời khuyên mà cụ thể áp dụng đối với việc sử dụng numpy, scipyhoặc pylabthư viện.

Đây có thể là một trong những cách để rút ngắn mã đã sử dụng numpyhoặc cách rút ngắn các hoạt động python thông thường bằng cách sử dụng các thư viện này.

Một lời khuyên cho mỗi câu trả lời, xin vui lòng.


Lưu ý rằng pylabchỉ là matplotlib.pyplot+ numpytrong một không gian tên chung không dùng nữa. Một numpyphần của pylabnó là tầm thường theo nghĩa là hàng nhập khẩu của họ có cùng số byte, vì vậy chỉ những thứ âm mưu mới có thể bổ sung đến pylab, nhưng tôi nghi ngờ đó không phải là những gì bạn nghĩ trong câu hỏi của mình.
Andras Deak

2
@AndrasDeak, tôi biết rằng sử dụng pylab được coi là thực hành xấu, nhưng rất ít trong codegolf có thể được coi là thực hành tốt. Pylab trực tiếp bao gồm các bộ phận của nhiều numpygói. Ví dụ pylab.randintlà hợp lệ khi numpy sẽ yêu cầu numpy.random.randint. Vì vậy, để chơi golf pylabnên cung cấp mã ngắn hơn.
dùng2699

1
Tôi biết rằng sự phản đối không phải là một vấn đề, quan điểm của tôi là nó cũng không mang lại lợi thế. Tôi chỉ đơn giản là không nhận ra rằng các gói con cũng được tải vào không gian tên pylab như thế! Xin lỗi, bạn hoàn toàn đúng :)
Andras Deak

Câu trả lời:


5

Tận dụng việc phát sóng của Numpy

Phát sóng có nghĩa là sao chép một mảng nhiều chiều dọc theo một số kích thước đơn lẻ của nó để phù hợp với kích thước của mảng khác. Điều này xảy ra tự động cho các mảng Numpy khi các toán tử số học được áp dụng cho chúng.

Ví dụ: để tạo bảng nhân 10 × 10, bạn có thể sử dụng

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

Hãy thử trực tuyến!

Ở đây tđược tạo ra như là mảng Numpy [1, 2, ..., 10]. Cái này có hình dạng (10,), tương đương với (1,10). Mảng toán hạng khác t[:,None], có kích thước (10,1). Nhân hai mảng ngầm sao chép chúng, vì vậy chúng hành xử như thể cả hai đều có hình dạng (10,10). Kết quả, cũng có hình dạng (10,10), chứa các sản phẩm cho tất cả các cặp mục trong mảng ban đầu.


Đó là một cách sử dụng thông minh zipvới việc phát sóng, đó có phải là câu trả lời của chính nó không?
dùng2699

@ user2699 Tôi không nghĩ nó đáng để trả lời riêng vì [*zip(t)]có cùng số byte càng dễ đọc hơn t[:,None]. Nhưng bạn đã đúng, nó có thể đáng chú ý, vì vậy tôi đã thêm nó trở lại đây
Luis Mendo

Điểm hay, tôi đoán tôi đã không thực sự đếm byte. [*zip(t)]sẽ ngắn hơn hai byte nếu có nhiều kích thước hơn.
dùng2699

1
Lưu ý rằng việc giải nén lặp lại mở rộng [*zip(t)]sẽ chỉ hoạt động trên python 3.
Andras Deak

Tôi đã xem trang này khi tôi muốn tìm hiểu xem cái gì mà Perl 6 không có. Dù sao, nó sẽ được viết là my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]hoặc bạn có thể sử dụngzip(t)
Brad Gilbert b2gills

2

Sử dụng r _ [...] thay vì phạm vi (...)

Numpy cung cấp cú pháp như MATLAB để tạo mảng bằng cách sử dụng r_[...]. Bất kỳ ký hiệu lát ở giữa các dấu ngoặc được hiểu là một mảng với phạm vi được chỉ định. Vì vậy, ví dụ

r_[:30:4]

tương đương với

arange(0,30,4)

và đối với hầu hết các sử dụng có thể thay thế

range(0,30 4)

Nó cũng có thể xử lý các biểu thức phức tạp hơn. Ví dụ: để nhận các chỉ số từ 0 đến 10 và quay lại lần nữa,

r_[:10,10:-1:-1]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.