Numpy: Tôi nên sử dụng newaxis hay None?


91

Trong numpy, người ta có thể sử dụng đối tượng 'newaxis' trong cú pháp cắt để tạo một trục có độ dài một, ví dụ:

import numpy as np
print np.zeros((3,5))[:,np.newaxis,:].shape
# shape will be (3,1,5)

Các tiểu bang tài liệu rằng người ta cũng có thể sử dụng Nonethay vì newaxis, hiệu quả là giống hệt nhau.

Có lý do gì để chọn cái này hơn cái kia không? Có bất kỳ sở thích chung hoặc hướng dẫn phong cách nào không? Ấn tượng của tôi là nó newaxisphổ biến hơn, có lẽ vì nó rõ ràng hơn. Vậy có lý do gì Noneđược phép không?

Câu trả lời:


103

Noneđược cho phép vì numpy.newaxischỉ là bí danh cho None.

In [1]: import numpy

In [2]: numpy.newaxis is None
Out[2]: True

Các tác giả có lẽ đã chọn nó vì họ cần một hằng số thuận tiện và Nonecó sẵn.

Về lý do tại sao bạn nên thích newaxishơn None: chủ yếu là vì nó rõ ràng hơn, và một phần vì một ngày nào đó numpytác giả có thể thay đổi nó thành một cái gì đó khác hơn None. (Họ không định, và có lẽ sẽ không, nhưng không có lý do chính đáng để thích hơn None.)


Cảm ơn, tôi đã không nhận thấy rằng np.newaxis thực sự là Không. Tôi sẽ đi với newaxis sau đó.
nikow

7
Họ thực sự nói rằng bạn có thể sử dụng None, vì vậy họ không thể thay đổi nó bây giờ: "Đối tượng newaxis có thể được sử dụng trong cú pháp cắt cơ bản được thảo luận ở trên. Không ai cũng có thể được sử dụng thay thế cho newaxis."
endolith

5
Ngoài ra, nếu bạn làm việc với những người không quen thuộc với các chi tiết của lập chỉ mục numpy, họ dường như phát điên khi thấy các mảng được tham chiếu bởi "Không có"
Peter

1
Một điểm khi Nonetốt hơn là tối ưu hóa tốc độ thực thi, nó có thể mang lại lợi ích rất nhỏ về thời gian. Nhưng thường thì bạn nên thích hơn np.newaxis.
godaygo

2
Tại sao họ không sử dụng newaxis = object()(hoặc tương đương mức C) là ngoài tôi ... sử dụng Nonekhá dễ xảy ra lỗi. Tôi có một hàm bị lỗi (một hàm returnđược cho là trả về một mảng boolean) và tôi bắt đầu gặp lỗi do hình dạng không khớp. Tôi mất một thời gian để nhận ra rằng lập chỉ mục với Nonekhông chỉ đơn giản là tăng một IndexError. Nếu họ đã sử dụng một trọng điểm giá trị "tươi" Tôi đã tránh được 30 phút cố gắng để làm cho ý nghĩa của lỗi ...
Giacomo Alzetta
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.