เพิ่มองค์ประกอบเดียวในอาร์เรย์เป็นตัวเลข


122

ฉันมีอาร์เรย์จำนวนนับที่ประกอบด้วย:

[1, 2, 3]

ฉันต้องการสร้างอาร์เรย์ที่มี:

[1, 2, 3, 1]

นั่นคือฉันต้องการเพิ่มองค์ประกอบแรกที่ส่วนท้ายของอาร์เรย์

ฉันได้ลองสิ่งที่ชัดเจนแล้ว:

np.concatenate((a, a[0]))

แต่ฉันได้รับข้อผิดพลาดว่า ValueError: arrays must have same number of dimensions

ฉันไม่เข้าใจสิ่งนี้ - อาร์เรย์เป็นทั้งอาร์เรย์ 1d


1
np.insert([1,2,3], 3, 1)
Sparkler

คำตอบ:


163

append() สร้างอาร์เรย์ใหม่ซึ่งอาจเป็นอาร์เรย์เก่าที่มีองค์ประกอบต่อท้าย

ฉันคิดว่าเป็นเรื่องปกติมากกว่าที่จะใช้วิธีที่เหมาะสมในการเพิ่มองค์ประกอบ:

a = numpy.append(a, a[0])

29
คำสั่งนี้ไม่เปลี่ยนแปลงaอาร์เรย์ อย่างไรก็ตามจะส่งคืนอาร์เรย์ที่แก้ไขใหม่ ดังนั้นหากa จำเป็นต้องมีการปรับเปลี่ยนก็a = numpy.append(a,a[0])ต้องใช้
Amjad

np.appendnp.concatenateการใช้งาน มันทำให้แน่ใจว่าส่วนเสริมมีมิติเดียว ข้อผิดพลาด OP คือa[0]มีมิติข้อมูล 0
hpaulj

เหตุใด append จึงสร้างอาร์เรย์ใหม่ทั้งหมดหากฉันต้องการเพิ่มองค์ประกอบเดียว
ed22

ฉันไม่ชอบที่เราต้องเรียกใช้ฟังก์ชันอื่นสำหรับคำสั่งง่ายๆเช่นนี้ มันจะดีกว่าถ้ามีวิธีการภายในในอาร์เรย์ที่ตัวเองชอบa.append(1), a.add(1)หรือแม้กระทั่งสิ่งที่อะนาล็อกไปยังรายการเช่นa + [1]
เฟอร์นันโดวิทท์

17

เมื่อต่อท้ายเพียงครั้งเดียวหรือทุก ๆ ครั้งการใช้np.appendอาร์เรย์ของคุณก็น่าจะใช้ได้ ข้อเสียเปรียบของแนวทางนี้คือหน่วยความจำจะถูกจัดสรรสำหรับอาร์เรย์ใหม่ทุกครั้งที่มีการเรียกใช้ เมื่อเพิ่มอาร์เรย์สำหรับตัวอย่างจำนวนมากจะเป็นการดีกว่าที่จะจัดสรรอาร์เรย์ล่วงหน้า (หากทราบขนาดทั้งหมด) หรือผนวกเข้ากับรายการและแปลงเป็นอาร์เรย์ในภายหลัง

ใช้np.append:

b = np.array([0])
for k in range(int(10e4)):
    b = np.append(b, k)
1.2 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

การใช้รายการ python แปลงเป็นอาร์เรย์ในภายหลัง:

d = [0]
for k in range(int(10e4)):
    d.append(k)
f = np.array(d)
13.5 ms ± 277 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

การจัดสรรอาร์เรย์ numpy ล่วงหน้า:

e = np.zeros((n,))
for k in range(n):
    e[k] = k
9.92 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

เมื่อขนาดสุดท้ายไม่ทราบการจัดสรรล่วงหน้าเป็นเรื่องยากฉันได้ลองจัดสรรล่วงหน้าเป็นกลุ่ม 50 แต่ก็ไม่ได้ใกล้เคียงกับการใช้รายการ

85.1 ms ± 561 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

14

a[0]ไม่ใช่อาร์เรย์เป็นองค์ประกอบแรกaและไม่มีมิติ

ลองใช้a[0:1]แทนซึ่งจะส่งคืนองค์ประกอบแรกaภายในอาร์เรย์รายการเดียว


12

ลองสิ่งนี้:

np.concatenate((a, np.array([a[0]])))

http://docs.scipy.org/doc/numpy/reference/generated/numpy.concatenate.html

เชื่อมต่อกันต้องการให้ทั้งสององค์ประกอบเป็นอาร์เรย์จำนวนนับ อย่างไรก็ตาม [0] ไม่ใช่อาร์เรย์ นั่นคือเหตุผลที่มันไม่ทำงาน


หรือง่ายnp.concatenate((a, [a[0]]))กว่านั้น รายการนี้จะได้รับการเลื่อนระดับเป็นประเภทอาร์เรย์โดยอัตโนมัติช่วยให้คุณประหยัดเวลาในการพิมพ์
Mad Physicist

10

คำสั่งนี้

numpy.append(a, a[0])

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

a = numpy.append(a, a[0])


3

นี่อาจจะมากเกินไป แต่ฉันมักจะใช้np.takeฟังก์ชันนี้สำหรับการจัดทำดัชนีแบบสรุป:

>>> a = np.array([1, 2, 3])
>>> np.take(a, range(0, len(a)+1), mode='wrap')
array([1, 2, 3, 1])

>>> np.take(a, range(-1, len(a)+1), mode='wrap')
array([3, 1, 2, 3, 1])

2

สมมติว่าคุณอยากให้มันเป็นa=[1,2,3][1,2,3,1]

คุณสามารถใช้ฟังก์ชันผนวกในตัว

np.append(a,1)

นี่ 1 คือ int ซึ่งอาจเป็นสตริงและอาจเป็นหรือไม่เป็นขององค์ประกอบในอาร์เรย์ พิมพ์:[1,2,3,1]


ยินดีต้อนรับสู่ StackOverflow! คุณอาจต้องการอ่านคู่มือนี้เกี่ยวกับวิธีจัดรูปแบบโค้ดจากนั้นอัปเดตคำตอบของคุณเพื่อให้อ่านได้ง่ายขึ้น :) นี่เป็นคำถามเก่ามากที่มีคำตอบที่ยอมรับได้ดีกว่าที่จะตอบคำถามใหม่ ๆ
0mpurdy

0

หากคุณต้องการเพิ่มองค์ประกอบให้ใช้ append()

a = numpy.append(a, 1) ในกรณีนี้ให้เพิ่ม 1 ที่ท้ายอาร์เรย์

หากคุณต้องการแทรกองค์ประกอบให้ใช้ insert()

a = numpy.insert(a, index, 1) ในกรณีนี้คุณสามารถใส่ 1 ในตำแหน่งที่คุณต้องการโดยใช้ดัชนีเพื่อกำหนดตำแหน่งในอาร์เรย์

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