ฉันจะลบองค์ประกอบเฉพาะบางอย่างออกจากอาร์เรย์ numpy ได้อย่างไร บอกว่าฉันมี
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
จากนั้นผมก็ต้องการที่จะลบจาก3,4,7
a
สิ่งที่ฉันรู้คือดัชนีของค่า ( index=[2,3,6]
)
ฉันจะลบองค์ประกอบเฉพาะบางอย่างออกจากอาร์เรย์ numpy ได้อย่างไร บอกว่าฉันมี
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9])
จากนั้นผมก็ต้องการที่จะลบจาก3,4,7
a
สิ่งที่ฉันรู้คือดัชนีของค่า ( index=[2,3,6]
)
คำตอบ:
ใช้numpy.delete () - ส่งคืนอาร์เรย์ใหม่ที่มีอาร์เรย์ย่อยตามแนวแกนที่ถูกลบ
numpy.delete(a, index)
สำหรับคำถามเฉพาะของคุณ:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
index = [2, 3, 6]
new_a = np.delete(a, index)
print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`
โปรดทราบว่าnumpy.delete()
ส่งคืนอาร์เรย์ใหม่เนื่องจากสเกลาของอาเรย์นั้นไม่สามารถเปลี่ยนรูปได้เหมือนกับสตริงใน Python ดังนั้นทุกครั้งที่มีการเปลี่ยนแปลงจะมีการสร้างออบเจ็กต์ใหม่ นั่นคือเพื่ออ้างอิงdelete()
เอกสาร :
" สำเนาของ arr ที่มีองค์ประกอบที่ระบุโดย obj ถูกลบโปรดทราบว่าการลบจะไม่เกิดขึ้นในสถานที่ ... "
หากรหัสที่ฉันโพสต์มีเอาท์พุทเป็นผลมาจากการเรียกใช้รหัส
มีฟังก์ชั่นในตัวเพื่อรองรับสิ่งนั้น
import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([3,4,7])
>>> c = np.setdiff1d(a,b)
>>> c
array([1, 2, 5, 6, 8, 9])
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
อาร์เรย์ Numpy นั้นไม่เปลี่ยนรูปซึ่งหมายความว่าคุณไม่สามารถลบรายการออกได้ในทางเทคนิค อย่างไรก็ตามคุณสามารถสร้างอาร์เรย์ใหม่โดยไม่มีค่าที่คุณไม่ต้องการเช่นนี้
b = np.delete(a, [2,3,6])
a[0]=1
แก้ไขa
ในสถานที่ แต่พวกเขาไม่สามารถปรับขนาด
หากต้องการลบตามค่า:
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
ฉันไม่ได้เป็นคนขี้แพ้
>>> import numpy as np
>>> import itertools
>>>
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> index=[2,3,6]
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))
>>> a
array([1, 2, 5, 6, 8, 9])
จากการทดสอบของฉันมีประสิทธิภาพดีกว่าnumpy.delete()
นี้ ฉันไม่รู้ว่าทำไมเป็นเช่นนั้นอาจเป็นเพราะอาร์เรย์ขนาดเล็กเริ่มต้นใช่ไหม
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
100000 loops, best of 3: 12.9 usec per loop
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)"
10000 loops, best of 3: 108 usec per loop
นั่นคือความแตกต่างอย่างมีนัยสำคัญ (ในทิศทางตรงกันข้ามกับสิ่งที่ฉันคาดหวัง) ทุกคนมีความคิดว่าทำไมถึงเป็นเช่นนั้น?
ยิ่งแปลกกว่านั้นการผ่านnumpy.delete()
รายการมีประสิทธิภาพแย่กว่าการวนลูปผ่านรายการและให้ดัชนีเดียว
python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)"
10000 loops, best of 3: 33.8 usec per loop
แก้ไข: ดูเหมือนว่าจะทำอย่างไรกับขนาดของอาร์เรย์ ด้วยอาร์เรย์ขนาดใหญ่numpy.delete()
จะเร็วกว่ามาก
python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
10 loops, best of 3: 200 msec per loop
python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)"
1000 loops, best of 3: 1.68 msec per loop
เห็นได้ชัดว่านี่เป็นสิ่งที่ไม่เกี่ยวข้องอย่างที่ควรจะเป็นเพื่อความชัดเจนและหลีกเลี่ยงการสร้างล้อใหม่ แต่ฉันคิดว่ามันน่าสนใจเล็กน้อยดังนั้นฉันคิดว่าฉันจะทิ้งมันไว้ที่นี่
a = delte_stuff(a)
ในการทำซ้ำครั้งแรกของคุณซึ่งทำให้a
เล็กลงสำหรับการทำซ้ำทุกครั้ง เมื่อคุณใช้ฟังก์ชั่น inbuild คุณจะไม่เก็บค่ากลับเป็น a ซึ่งเก็บ a ในขนาดดั้งเดิม! นอกจากนั้นคุณสามารถเร่งความเร็วฟังก์ชั่นของคุณอย่างมากเมื่อคุณสร้างชุดของindex
และตรวจสอบว่าจะลบรายการหรือไม่ แก้ไขทั้งสองอย่างฉันได้ไอเท็ม 10k: 6.22 msec ต่อลูปพร้อมกับฟังก์ชั่นของคุณ 4.48 msec สำหรับnumpy.delete
ซึ่งเป็นสิ่งที่คุณคาดหวัง
np.array(list(range(x)))
ใช้งานและการสร้างดัชนีคุณสามารถใช้np.arange(x)
np.s_[::2]
หากคุณไม่รู้จักดัชนีคุณไม่สามารถใช้งานได้ logical_and
x = 10*np.random.randn(1,100)
low = 5
high = 27
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]
การใช้ np.delete
เป็นวิธีที่เร็วที่สุดในการทำหากเรารู้ดัชนีขององค์ประกอบที่เราต้องการลบ อย่างไรก็ตามเพื่อความสมบูรณ์ให้ฉันเพิ่มวิธีการ "ถอด" np.isin
องค์ประกอบมากมายโดยใช้หน้ากากแบบบูลที่สร้างขึ้นด้วยความช่วยเหลือของอีก วิธีนี้ช่วยให้เราสามารถลบองค์ประกอบโดยระบุพวกเขาโดยตรงหรือดัชนีของพวกเขา:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
ลบตามดัชนี :
indices_to_remove = [2, 3, 6]
a = a[~np.isin(np.arange(a.size), indices_to_remove)]
ลบตามองค์ประกอบ (อย่าลืมสร้างต้นฉบับใหม่a
เนื่องจากเขียนใหม่ในบรรทัดก่อนหน้า):
elements_to_remove = a[indices_to_remove] # [3, 4, 7]
a = a[~np.isin(a, elements_to_remove)]
ลบดัชนีเฉพาะ (ฉันลบ 16 และ 21 ออกจากเมทริกซ์)
import numpy as np
mat = np.arange(12,26)
a = [4,9]
del_map = np.delete(mat, a)
del_map.reshape(3,4)
เอาท์พุท:
array([[12, 13, 14, 15],
[17, 18, 19, 20],
[22, 23, 24, 25]])
คุณยังสามารถใช้ชุด:
a = numpy.array([10, 20, 30, 40, 50, 60, 70, 80, 90])
the_index_list = [2, 3, 6]
the_big_set = set(numpy.arange(len(a)))
the_small_set = set(the_index_list)
the_delta_row_list = list(the_big_set - the_small_set)
a = a[the_delta_row_list]