ความแตกต่างระหว่างฟังก์ชั่น array Numpy () และ asarray () คืออะไร?


297

ความแตกต่างระหว่าง Numpy คืออะไรarray()และasarray()ฟังก์ชั่น? คุณควรใช้อันใดอันหนึ่งมากกว่าอันอื่น ดูเหมือนว่าพวกเขาจะสร้างผลลัพธ์ที่เหมือนกันสำหรับอินพุตทั้งหมดที่ฉันคิดได้

คำตอบ:


110

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

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

arrayมีตัวเลือกที่หลากหลาย (ฟังก์ชั่นอื่น ๆ ส่วนใหญ่เป็นแบบห่อหุ้มรอบ ๆ ) รวมถึงแฟล็กเพื่อกำหนดเวลาที่จะคัดลอก คำอธิบายแบบเต็มอาจใช้เวลานานเท่าที่เอกสาร (ดูที่การสร้างอาร์เรย์แต่สั้น ๆ นี่คือตัวอย่าง:

สมมติว่าaเป็นndarrayและmเป็นmatrixและพวกเขาทั้งสองมีdtypeของfloat32:

  • np.array(a)และnp.array(m)จะคัดลอกทั้งคู่เพราะนั่นเป็นพฤติกรรมเริ่มต้น
  • np.array(a, copy=False)และnp.array(m, copy=False)จะคัดลอกmแต่ไม่aเพราะไม่ได้เป็นmndarray
  • np.array(a, copy=False, subok=True)และnp.array(m, copy=False, subok=True)จะคัดลอกค่าเพราะmเป็นmatrixซึ่งเป็น subclass ndarrayของ
  • np.array(a, dtype=int, copy=False, subok=True)จะคัดลอกทั้งสองเพราะdtypeไม่เข้ากัน

ฟังก์ชั่นอื่น ๆ ส่วนใหญ่เป็นเครื่องห่อหุ้มรอบ ๆ ตัวarrayควบคุมเมื่อทำการคัดลอกเกิดขึ้น:

  • asarray: อินพุตจะถูกส่งคืนถ้าไม่มีมันเข้ากันได้ถ้ามันเข้ากันได้ndarray( copy=False)
  • asanyarray: อินพุตจะถูกส่งคืนถ้าไม่มีมันเข้ากันได้ndarrayหรือ subclass เช่นmatrix( copy=False, subok=True)
  • ascontiguousarray: อินพุทจะถูกส่งคืนหากไม่มีความเข้ากันได้กับndarrayคำสั่ง C ที่ต่อเนื่องกัน ( copy=False, order='C').
  • asfortranarray: ข้อมูลจะถูกส่งคืนถ้าไม่มีความเข้ากันได้ndarrayในคำสั่ง Fortran ( copy=False, order='F') ที่ต่อเนื่องกัน
  • require: อินพุตจะถูกส่งคืนหากไม่มีข้อมูลเข้ากันได้กับสตริงข้อกำหนดที่ระบุ
  • copy: อินพุตถูกคัดลอกเสมอ
  • fromiter: อินพุตถือว่าเป็น iterable (เช่นคุณสามารถสร้างอาร์เรย์จากองค์ประกอบของ iterator แทนที่จะเป็นobjectarray ที่มี iterator) คัดลอกเสมอ

นอกจากนี้ยังมีฟังก์ชั่นอำนวยความสะดวกเช่นasarray_chkfinite(กฎการคัดลอกเหมือนกันasarrayแต่เพิ่มขึ้นValueErrorหากมีnanหรือมีinfค่า) และตัวสร้างสำหรับคลาสย่อยเช่นmatrixหรือสำหรับกรณีพิเศษเช่นอาร์เรย์เรคคอร์ดและแน่นอนตัวndarrayสร้างจริง(ซึ่งช่วยให้คุณสร้างอาร์เรย์โดยตรง ก้าวออกมาเหนือบัฟเฟอร์)


ขอบคุณสำหรับสิ่งนี้มันมีประโยชน์มาก
Kris

234

ความหมายของการasarrayมีที่:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

ดังนั้นมันจึงเป็นเช่นนอกจากจะมีตัวเลือกน้อยลงและarray มีค่าเริ่มต้นcopy=Falsearraycopy=True

ความแตกต่างหลักคือarray(โดยค่าเริ่มต้น) จะทำสำเนาของวัตถุในขณะที่asarrayจะไม่เว้นแต่จำเป็น


13
ดังนั้นเราควรใช้แต่ละเมื่อ หากสร้างอาร์เรย์จากศูนย์ซึ่งดีกว่าarray([1, 2, 3])หรือasarray([1, 2, 3])?
endolith

15
@endolith: เป็นรายการหลามดังนั้นสำเนาของข้อมูลที่จะต้องทำในการสร้าง[1, 2, 3] ndararyดังนั้นการใช้np.arrayโดยตรงแทนnp.asarrayซึ่งจะส่งพารามิเตอร์copy=False np.arrayการดำเนินการcopy=Falseนี้จะถูกละเว้นหากต้องทำสำเนาตามที่เป็นในกรณีนี้ หากคุณเปรียบเทียบทั้งสองที่ใช้%timeitใน IPython คุณจะเห็นความแตกต่างสำหรับรายการขนาดเล็ก แต่แทบจะไม่สำคัญว่าคุณจะใช้กับรายการขนาดใหญ่ได้อย่างไร
unutbu

3
มันสมเหตุสมผลสำหรับชื่อเมธอดด้วยเช่นกัน: "asarray": ถือว่านี่เป็นอาร์เรย์ (inplace) นั่นคือคุณกำลังเปลี่ยนมุมมองของคุณในรายการ / อาร์เรย์นี้ "array": แปลงค่านี้เป็นอาร์เรย์ใหม่จริง ๆ
denvar

1
แล้วไงnp.asanyarrayล่ะ
Lee

3
@Lee: เสมอกลับasarray จะส่งคืนคลาสย่อยของหากนั่นคือสิ่งที่ผ่านไปแล้ว ยกตัวอย่างเช่นเป็น subclass ของ ดังนั้นผลตอบแทนเมทริกซ์เดียวกันในขณะที่แปลงเมทริกซ์ไปยัง ndarrayasanyarrayndarraynp.matrixndarraynp.asanyarray(np.matrix(...))np.asarray(np.matrix(...))ndarray
unutbu

114

ตัวอย่างนี้สามารถแสดงความแตกต่างได้:

  1. สร้างเมทริกซ์

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    
  2. ใช้ในการปรับเปลี่ยนnumpy.array Aไม่ทำงานเนื่องจากคุณกำลังแก้ไขสำเนา

    >>> numpy.array(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    
  3. ใช้ในการปรับเปลี่ยนnumpy.asarray Aมันทำงานได้เพราะคุณกำลังแก้ไขAตัวเอง

    >>> numpy.asarray(A)[2]=2
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 2.,  2.,  2.]])
    

หวังว่านี่จะช่วยได้!


13

ความแตกต่างที่กล่าวถึงก็ค่อนข้างชัดเจนในเอกสารประกอบของและarray asarrayความแตกต่างอยู่ในรายการอาร์กิวเมนต์และการกระทำของฟังก์ชันขึ้นอยู่กับพารามิเตอร์เหล่านั้น

นิยามฟังก์ชั่นคือ:

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)

และ

numpy.asarray(a, dtype=None, order=None)

อาร์กิวเมนต์ต่อไปนี้เป็นสิ่งที่อาจถูกส่งผ่านไปarrayและไม่ได้ asarrayกล่าวถึงในเอกสารประกอบ:

สำเนา: บูล, ตัวเลือกถ้าเป็นจริง (เริ่มต้น) แล้ววัตถุจะถูกคัดลอก มิฉะนั้นจะทำการคัดลอกก็ต่อเมื่อ__array__ส่งคืนสำเนาหาก obj เป็นลำดับซ้อนกันหรือหากจำเป็นต้องทำสำเนาเพื่อตอบสนองความต้องการอื่น ๆ (dtype, order, etc. )

subok: bool เป็นตัวเลือกถ้าเป็น True แล้วคลาสย่อยจะถูกส่งผ่านมิฉะนั้นอาร์เรย์ที่ส่งคืนจะถูกบังคับให้เป็นอาร์เรย์คลาสพื้นฐาน (ค่าเริ่มต้น)

ndmin: int เป็นทางเลือกระบุจำนวนมิติต่ำสุดที่อาร์เรย์ผลลัพธ์ควรมี คนที่จะรูปร่างล่วงหน้าตามที่จำเป็นเพื่อตอบสนองความต้องการนี้


1

นี่คือตัวอย่างง่ายๆที่สามารถแสดงให้เห็นถึงความแตกต่าง

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

import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)

เนื้อหาในอาเรย์ (a) ยังคงไม่ถูกแตะต้องและยังคงเราสามารถดำเนินการใด ๆ กับข้อมูลโดยใช้วัตถุอื่นโดยไม่แก้ไขเนื้อหาในอาเรย์ดั้งเดิม


0

asarray(x) ก็เหมือน array(x, copy=False)

ใช้asarray(x)เมื่อคุณต้องการให้แน่ใจว่าxจะเป็นอาร์เรย์ก่อนที่จะดำเนินการอื่นใด หากxเป็นอาร์เรย์อยู่แล้วจะไม่มีการคัดลอก มันจะไม่ทำให้เกิดการซ้ำซ้อนของประสิทธิภาพ

นี่คือตัวอย่างของฟังก์ชั่นที่มั่นใจว่าxจะถูกแปลงเป็นอาร์เรย์ก่อน

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