สุ่มตัวอย่างทุกรายการที่ n ในอาร์เรย์ numpy


96

ฉันเป็นมือใหม่ที่มี numpy และฉันกำลังพยายามดึงข้อมูลบางส่วนจากอาร์เรย์จำนวนมาก สิ่งที่ฉันต้องทำคือเริ่มจากตำแหน่งที่กำหนดไว้ในอาร์เรย์ของฉันจากนั้นทำการย่อยทุกจุดข้อมูลที่ n จากตำแหน่งนั้นไปจนถึงจุดสิ้นสุดของอาร์เรย์ของฉัน

โดยทั่วไปถ้าฉันมี

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

ฉันต้องการย่อยสิ่งนี้เพื่อเริ่มต้นa[1]จากนั้นสุ่มตัวอย่างทุกๆจุดที่สี่จากตรงนั้น

b = [2,2,2.....]

คำตอบ:


163

คุณสามารถใช้หั่น numpy ของstart:stop:stepโปรด

>>> xs
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
>>> xs[1::4]
array([2, 2, 2])

นี้จะสร้างมุมมองของข้อมูลเดิมดังนั้นจึงเป็นเวลาอย่างต่อเนื่อง นอกจากนี้ยังจะแสดงการเปลี่ยนแปลงของอาร์เรย์เดิมและเก็บอาร์เรย์เดิมทั้งหมดไว้ในหน่วยความจำ:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2]         # O(1), constant time
>>> b[:] = 0           # modifying the view changes original array
>>> a                  # original array is modified
array([0, 2, 0, 4, 0])

ดังนั้นหากสิ่งใดสิ่งหนึ่งข้างต้นเป็นปัญหาคุณสามารถทำสำเนาได้อย่างชัดเจน:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2].copy()  # explicit copy, O(n)
>>> b[:] = 0           # modifying the copy
>>> a                  # original is intact
array([1, 2, 3, 4, 5])

นี่ไม่ใช่เวลาคงที่ แต่ผลลัพธ์ไม่ได้เชื่อมโยงกับอาร์เรย์เดิม สำเนายังติดกันในหน่วยความจำซึ่งสามารถทำให้การดำเนินการบางอย่างเร็วขึ้น


1
ขอบคุณสำหรับคำเตือนเกี่ยวกับสำเนาอ้างอิง / ค่า ไม่งั้นฉันจะตกหลุมพรางแน่ ๆ
ตลอดไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.