คำตอบ:
เนื่องจากคำถามอื่น ๆ กำลังถูกเปลี่ยนเส้นทางไปยังคำถามนี้ซึ่งถามเกี่ยวกับ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เพราะไม่ได้เป็นmndarraynp.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สร้างจริง(ซึ่งช่วยให้คุณสร้างอาร์เรย์โดยตรง ก้าวออกมาเหนือบัฟเฟอร์)
ความหมายของการasarrayมีที่:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
ดังนั้นมันจึงเป็นเช่นนอกจากจะมีตัวเลือกน้อยลงและarray มีค่าเริ่มต้นcopy=Falsearraycopy=True
ความแตกต่างหลักคือarray(โดยค่าเริ่มต้น) จะทำสำเนาของวัตถุในขณะที่asarrayจะไม่เว้นแต่จำเป็น
array([1, 2, 3])หรือasarray([1, 2, 3])?
[1, 2, 3] ndararyดังนั้นการใช้np.arrayโดยตรงแทนnp.asarrayซึ่งจะส่งพารามิเตอร์copy=False np.arrayการดำเนินการcopy=Falseนี้จะถูกละเว้นหากต้องทำสำเนาตามที่เป็นในกรณีนี้ หากคุณเปรียบเทียบทั้งสองที่ใช้%timeitใน IPython คุณจะเห็นความแตกต่างสำหรับรายการขนาดเล็ก แต่แทบจะไม่สำคัญว่าคุณจะใช้กับรายการขนาดใหญ่ได้อย่างไร
np.asanyarrayล่ะ
asarray จะส่งคืนคลาสย่อยของหากนั่นคือสิ่งที่ผ่านไปแล้ว ยกตัวอย่างเช่นเป็น subclass ของ ดังนั้นผลตอบแทนเมทริกซ์เดียวกันในขณะที่แปลงเมทริกซ์ไปยัง ndarrayasanyarrayndarraynp.matrixndarraynp.asanyarray(np.matrix(...))np.asarray(np.matrix(...))ndarray
ตัวอย่างนี้สามารถแสดงความแตกต่างได้:
สร้างเมทริกซ์
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
ใช้ในการปรับเปลี่ยนnumpy.array Aไม่ทำงานเนื่องจากคุณกำลังแก้ไขสำเนา
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
ใช้ในการปรับเปลี่ยนnumpy.asarray Aมันทำงานได้เพราะคุณกำลังแก้ไขAตัวเอง
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
หวังว่านี่จะช่วยได้!
ความแตกต่างที่กล่าวถึงก็ค่อนข้างชัดเจนในเอกสารประกอบของและ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 เป็นทางเลือกระบุจำนวนมิติต่ำสุดที่อาร์เรย์ผลลัพธ์ควรมี คนที่จะรูปร่างล่วงหน้าตามที่จำเป็นเพื่อตอบสนองความต้องการนี้
นี่คือตัวอย่างง่ายๆที่สามารถแสดงให้เห็นถึงความแตกต่าง
ความแตกต่างที่สำคัญคืออาร์เรย์จะทำสำเนาข้อมูลต้นฉบับและใช้วัตถุที่แตกต่างกันซึ่งเราสามารถแก้ไขข้อมูลในอาร์เรย์เดิมได้
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
เนื้อหาในอาเรย์ (a) ยังคงไม่ถูกแตะต้องและยังคงเราสามารถดำเนินการใด ๆ กับข้อมูลโดยใช้วัตถุอื่นโดยไม่แก้ไขเนื้อหาในอาเรย์ดั้งเดิม
asarray(x) ก็เหมือน array(x, copy=False)
ใช้asarray(x)เมื่อคุณต้องการให้แน่ใจว่าxจะเป็นอาร์เรย์ก่อนที่จะดำเนินการอื่นใด หากxเป็นอาร์เรย์อยู่แล้วจะไม่มีการคัดลอก มันจะไม่ทำให้เกิดการซ้ำซ้อนของประสิทธิภาพ
นี่คือตัวอย่างของฟังก์ชั่นที่มั่นใจว่าxจะถูกแปลงเป็นอาร์เรย์ก่อน
def mysum(x):
return np.asarray(x).sum()