คำตอบ:
เนื่องจากคำถามอื่น ๆ กำลังถูกเปลี่ยนเส้นทางไปยังคำถามนี้ซึ่งถามเกี่ยวกับ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
เพราะไม่ได้เป็นm
ndarray
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 แทนที่จะเป็นobject
array ที่มี 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=False
array
copy=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 ของ ดังนั้นผลตอบแทนเมทริกซ์เดียวกันในขณะที่แปลงเมทริกซ์ไปยัง ndarray
asanyarray
ndarray
np.matrix
ndarray
np.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()