วิธีการแปลงอาเรย์ numpy array 2D เป็น numpy อาเรย์ 2 มิติ?


302

วิธีการแปลง array numpy จริงเป็น int numpy array? พยายามใช้แผนที่โดยตรงไปยังอาร์เรย์ แต่ไม่ได้ผล

คำตอบ:


404

ใช้astypeวิธีการ

>>> 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
ตรวจสอบให้แน่ใจว่าคุณไม่มีnp.infหรือnp.nanอยู่ในอาเรย์ของคุณเนื่องจากมันมีผลลัพธ์ที่น่าประหลาดใจ ยกตัวอย่างเช่นเอาท์พุทnp.array([np.inf]).astype(int) array([-9223372036854775808])
Garrett

บนเครื่องของฉันnp.array([np.inf]).astype(int), np.array([-np.inf]).astype(int)และnp.array([np.nan]).astype(int)ผลตอบแทนทุกสิ่งเดียวกัน ทำไม?
BallpointBen

1
@BallpointBen: nanและinfเป็นค่าจุดลอยตัวและไม่สามารถแปลงเป็น int ได้อย่างมีความหมาย ในฐานะที่เป็นความคิดเห็นก่อนบันทึกของคุณจะมีพฤติกรรมที่น่าแปลกใจและฉันไม่คิดว่าพฤติกรรมที่แม่นยำมีการกำหนดไว้อย่างดี ถ้าคุณต้องการแมปnanและinfค่าบางอย่างคุณต้องทำด้วยตัวเอง
BrenBarn

โปรดทราบว่า x.astype (int) [0] [0] intไม่ได้เป็นประเภท numpy.int32มัน
Chris Anderson

โปรดทราบว่าแม้ว่าสิ่งนี้จะแปลงอาร์เรย์เป็น ints แต่คำตอบของ @ fhtuft ที่อาจทำให้ประหลาดใจน้อยลง
Nathan Musoke

66

บางฟังก์ชั่น numpy สำหรับวิธีการในการควบคุมการปัดเศษ: rint , ชั้น , TRUNC , ceil ขึ้นอยู่กับว่าคุณต้องการปัดเศษลอยขึ้นลงหรือไปยัง int ที่ใกล้ที่สุด

>>> 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.]])

ในการทำให้หนึ่งในนี้เป็น int หรือเป็นหนึ่งในประเภทอื่นที่มีลักษณะเหมือน ntyty , astype (ตอบโดย BrenBern):

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

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

2
สิ่งที่ฉันกำลังมองหา astypeบ่อยครั้งเกินไปและฉันคิดว่ามันอาจมีประโยชน์มากกว่าเมื่อทำการแปลงแบบ intx - inty เมื่อฉันต้องการที่จะทำการลอย - การแปลง int สามารถเลือกชนิดของการปัดเศษเป็นคุณลักษณะที่ดี
Bakuriu

11
ดังนั้นวิธีที่ง่ายที่สุดในการแปลงค่า int-like 7.99999ให้เหมือน ints อย่างปลอดภัย8คือnp.rint(arr).astype(int)อะไร?
endolith

ด้วยวิธีใดก็ตามที่จะทำให้เป็น uint8
Ryan

2
@Ryanastype(np.uint8)
Chris Anderson

14

คุณสามารถใช้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

หากคุณไม่แน่ใจว่าใส่ของคุณเป็นไปได้อาร์เรย์ Numpy คุณสามารถใช้asarrayกับdtype=intแทนastype:

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

หากอาร์เรย์อินพุตมี dtype ที่ถูกต้องแล้วให้asarrayหลีกเลี่ยงการคัดลอกอาร์เรย์ในขณะที่astypeไม่มี (เว้นแต่คุณจะระบุ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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.