Làm thế nào để chuyển mảng 2D float numpy sang mảng 2D int numpy?


302

Làm thế nào để chuyển đổi mảng numpy thực sang mảng int numpy? Đã thử sử dụng bản đồ trực tiếp đến mảng nhưng nó không hoạt động.

Câu trả lời:


405

Sử dụng astypephương pháp.

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> x.astype(int)
array([[1, 2],
       [1, 2]])

30
Chỉ cần đảm bảo rằng bạn không có np.infhoặc np.nantrong mảng của bạn, vì chúng có kết quả đáng ngạc nhiên. Ví dụ, np.array([np.inf]).astype(int)đầu ra array([-9223372036854775808]).
Garrett

Trên máy tính của tôi, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int), và np.array([np.nan]).astype(int)tất cả trở lại điều tương tự. Tại sao?
BallpointBen

1
@BallpointBen: naninflà các giá trị dấu phẩy động và không thể được chuyển đổi thành int. Như nhận xét trước ghi chú của bạn, sẽ có hành vi đáng ngạc nhiên và tôi không nghĩ hành vi chính xác được xác định rõ. Nếu bạn muốn lập bản đồ naninfcác giá trị nhất định, bạn cần phải tự làm điều đó.
BrenBarn

Lưu ý rằng x.astype (int) [0] [0] không phải là loại int. Đó là numpy.int32.
Chris Anderson

Lưu ý rằng mặc dù điều này không chuyển đổi mảng thành ints, câu trả lời của @ fhtuft có thể dẫn đến ít bất ngờ hơn
Nathan Musoke

66

Một số chức năng numpy cho cách kiểm soát làm tròn: rint , sàn , trunc , trần . tùy thuộc vào cách bạn muốn làm tròn số phao, lên, xuống hoặc đến int gần nhất.

>>> x = np.array([[1.0,2.3],[1.3,2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> y = np.trunc(x)
>>> y
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> z = np.ceil(x)
>>> z
array([[ 1.,  3.],
       [ 2.,  3.]])
>>> t = np.floor(x)
>>> t
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> a = np.rint(x)
>>> a
array([[ 1.,  2.],
       [ 1.,  3.]])

Để thực hiện một trong những điều này thành int hoặc một trong các loại khác trong numpy, astype (như được trả lời bởi BrenBern):

a.astype(int)
array([[1, 2],
       [1, 3]])

>>> y.astype(int)
array([[1, 2],
       [1, 2]])

2
Chính xác những gì tôi đang tìm kiếm. astypethường quá chung chung và tôi nghĩ có lẽ hữu ích hơn khi thực hiện chuyển đổi intx - inty. Khi tôi muốn thực hiện float - chuyển đổi int có thể chọn loại làm tròn là một tính năng hay.
Bakuriu

11
Vì vậy, cách đơn giản nhất để chuyển đổi một cách an toàn gần như int 7.99999thành int như thế nào 8, là np.rint(arr).astype(int)?
endolith

bất kỳ cách nào trong numpy để làm cho nó uint8?
Ryan

2
@Ryanastype(np.uint8)
Chris Anderson

14

bạn có thể sử dụng np.int_:

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> np.int_(x)
array([[1, 2],
       [1, 2]])

12

Nếu bạn không chắc chắn đầu vào của bạn sẽ là một mảng NumPy, bạn có thể sử dụng asarrayvới dtype=intthay vì astype:

>>> np.asarray([1,2,3,4], dtype=int)
array([1, 2, 3, 4])

Nếu mảng đầu vào đã có dtype chính xác, asarraysẽ tránh việc sao chép mảng trong khi astypekhông (trừ khi bạn chỉ định copy=False):

>>> a = np.array([1,2,3,4])
>>> a is np.asarray(a)  # no copy :)
True
>>> a is a.astype(int)  # copy :(
False
>>> a is a.astype(int, copy=False)  # no copy :)
True
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.