ฉันจะสร้างอาร์เรย์ / เมทริกซ์ที่ว่างใน NumPy ได้อย่างไร


311

ฉันไม่สามารถหาวิธีใช้อาเรย์หรือเมทริกซ์ในวิธีที่ปกติฉันจะใช้รายการ ฉันต้องการสร้างอาร์เรย์ที่ว่างเปล่า (หรือเมทริกซ์) แล้วเพิ่มหนึ่งคอลัมน์ (หรือแถว) ทีละรายการ

ในขณะนี้วิธีเดียวที่ฉันสามารถทำได้คือ:

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))

ในกรณีที่เป็นรายการฉันจะทำสิ่งนี้:

list = []
for item in data:
    list.append(item)

มีวิธีใช้สัญกรณ์แบบนั้นสำหรับอาร์เรย์NumPyหรือเมทริกซ์หรือไม่?

คำตอบ:


441

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

ในกรณีของการเพิ่มแถวทางออกที่ดีที่สุดของคุณคือการสร้างอาร์เรย์ที่มีขนาดใหญ่เท่ากับชุดข้อมูลของคุณในที่สุดจากนั้นเพิ่มข้อมูลลงในแต่ละแถว:

>>> import numpy
>>> a = numpy.zeros(shape=(5,2))
>>> a
array([[ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])
>>> a[0] = [1,2]
>>> a[1] = [2,3]
>>> a
array([[ 1.,  2.],
   [ 2.,  3.],
   [ 0.,  0.],
   [ 0.,  0.],
   [ 0.,  0.]])

123
นอกจากนี้ยังมี numpy.empty () หากคุณไม่จำเป็นต้องใส่ค่าศูนย์
janneb

21
ประโยชน์ของการใช้ empty () มากกว่าศูนย์ () คืออะไร
Zach

45
หากคุณกำลังจะเริ่มต้นกับข้อมูลของคุณทันทีคุณประหยัดค่าใช้จ่ายของการเป็นศูนย์
marcorossi

16
@maracorossi ดังนั้น.empty()หมายความว่าเราสามารถหาค่าสุ่มในเซลล์ได้ แต่อาร์เรย์จะถูกสร้างเร็วกว่าเช่น.zeros()?
user3085931

6
@ user3085931 อ๋อ!
Nathan

98

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

เช่น


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

itemสามารถเป็นรายการอาร์เรย์หรือทำซ้ำได้ตราบใดที่แต่ละitemองค์ประกอบมีจำนวนเท่ากัน
ในกรณีนี้โดยเฉพาะ ( dataเป็นบางส่วนที่ซ้ำกันถือคอลัมน์เมทริกซ์) คุณสามารถใช้


mat = numpy.array(data)

(โปรดทราบว่าการใช้listเป็นชื่อตัวแปรอาจไม่ใช่วิธีปฏิบัติที่ดีเนื่องจากปิดบังประเภทที่มีอยู่แล้วภายในด้วยชื่อนั้นซึ่งอาจทำให้เกิดข้อบกพร่องได้)

แก้ไข:

ถ้าด้วยเหตุผลบางอย่างที่คุณต้องการสร้างอาเรย์ที่ว่างเปล่าคุณสามารถใช้อาเร numpy.array([])ย์ได้ แต่มันไม่ค่อยมีประโยชน์เลย!


1
Array numpy / matrices แตกต่างจาก Matlab โดยพื้นฐานหรือไม่?
levesque

1
หากมีเหตุผลบางอย่างที่คุณจำเป็นต้องกำหนดอาร์เรย์ว่างเปล่า แต่มีความกว้างคงที่ (เช่นnp.concatenate()), np.empty((0, some_width))คุณสามารถใช้: 0 ดังนั้นอาร์เรย์แรกของคุณจะไม่ขยะ
NumesSanguis

56

ในการสร้างอาเรย์หลายมิติที่ว่างเปล่าใน NumPy (เช่นอาเรย์ 2 มิติm*nเพื่อเก็บเมทริกซ์ของคุณ) ในกรณีที่คุณไม่ทราบmจำนวนแถวที่คุณจะผนวกและไม่สนใจค่าใช้จ่ายในการคำนวณที่สตีเฟ่นซิมมอนส์กล่าวไว้ อาร์เรย์ที่แต่ละผนวก) คุณสามารถบีบ 0 X = np.empty(shape=[0, n])มิติที่คุณต้องการที่จะผนวกกับ:

วิธีนี้คุณสามารถใช้เป็นตัวอย่าง (ที่นี่m = 5ซึ่งเราคิดว่าเราไม่รู้เมื่อสร้างเมทริกซ์ที่ว่างเปล่าและn = 2):

import numpy as np

n = 2
X = np.empty(shape=[0, n])

for i in range(5):
    for j  in range(2):
        X = np.append(X, [[i, j]], axis=0)

print X

ซึ่งจะทำให้คุณ:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]

1
นี่ควรเป็นคำตอบสำหรับคำถาม OP ที่ถามสำหรับกรณีการใช้งานที่คุณไม่ทราบ #rows ล่วงหน้าหรือต้องการจัดการกรณีที่มี 0 แถว
Spcogg วินาทีที่

26

ฉันมองสิ่งนี้มากเพราะฉันจำเป็นต้องใช้ numpy.array เป็นชุดในโครงการโรงเรียนของฉันและฉันต้องเริ่มต้นว่างเปล่า ... ฉันไม่พบคำตอบที่เกี่ยวข้องใน Stack Overflow ดังนั้นฉันจึงเริ่ม doodling บางสิ่งบางอย่าง

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

ผลลัพธ์จะเป็น:

In [34]: x
Out[34]: array([], dtype=float64)

ดังนั้นคุณสามารถเริ่มต้นอาร์เรย์ np โดยตรงดังนี้:

In [36]: x= np.array([], dtype=np.float64)

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


สิ่งนี้ใช้ไม่ได้กับอาร์เรย์เหมือนในคำถาม แต่อาจมีประโยชน์สำหรับเวกเตอร์
divenex

a=np.array([])ดูเหมือนว่าจะเป็นค่าเริ่มต้นfloat64
P ฉัน

7

คุณสามารถใช้ฟังก์ชั่นผนวก สำหรับแถว:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])

สำหรับคอลัมน์:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])

แก้ไข
แน่นอนตามที่ระบุไว้ในคำตอบอื่น ๆ ยกเว้นว่าคุณกำลังทำการประมวลผลบางอย่าง (เช่นการผกผัน) บนเมทริกซ์ / อาร์เรย์ทุกครั้งที่คุณต่อท้ายมันฉันจะสร้างรายการต่อท้ายจากนั้นแปลงเป็น แถว


3

หากคุณไม่ทราบขนาดสุดท้ายของอาร์เรย์คุณสามารถเพิ่มขนาดของอาร์เรย์ดังนี้:

my_arr = numpy.zeros((0,5))
for i in range(3):
    my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)

[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • สังเกตเห็น0ในบรรทัดแรก
  • numpy.appendเป็นอีกทางเลือกหนึ่ง มันเรียกnumpy.concatenateว่า

3

คุณสามารถใช้มันเพื่อสร้างอาร์เรย์ประเภทใดก็ได้เช่นเลขศูนย์:

a = range(5)
a = [i*0 for i in a]
print a 
[0, 0, 0, 0, 0]

4
หากคุณต้องการทำเช่นนั้นในงูหลามบริสุทธิ์a= [0] * 5เป็นทางออกที่ง่าย
Makers_F

3

นี่คือวิธีแก้ปัญหาบางประการที่ทำให้ numpys มีลักษณะเหมือนรายการ

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

OUTPUT: อาร์เรย์ ([2. , 24. ])


2

คุณอาจต้องระบุประเภทข้อมูล (ดู'dtype' ) ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณใช้สิ่งนี้

ตัวอย่างเช่นในการสร้างอาร์เรย์ 2 มิติของค่า 8 บิต (เหมาะสำหรับใช้เป็นภาพขาวดำ):

myarray = numpy.empty(shape=(H,W),dtype='u1')

สำหรับภาพ RGB ให้รวมจำนวนช่องสีในรูปร่าง: shape=(H,W,3)

นอกจากนี้คุณยังอาจต้องการที่จะต้องพิจารณาเป็นศูนย์เริ่มต้นด้วยแทนการใช้numpy.zeros numpy.emptyดูโน้ตที่นี่


1

ฉันคิดว่าคุณต้องการจัดการงานส่วนใหญ่กับรายการแล้วใช้ผลลัพธ์เป็นเมทริกซ์ บางทีนี่อาจเป็นวิธี

ur_list = []
for col in columns:
    ur_list.append(list(col))

mat = np.matrix(ur_list)

1

ฉันคิดว่าคุณสามารถสร้างอาร์เรย์ที่ว่างเปล่าเช่น:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

รูปแบบนี้มีประโยชน์เมื่อคุณต้องการผนวกอาร์เรย์ numpy ในลูป


0

สำหรับการสร้างอาร์เรย์ NumPy ที่ว่างเปล่าโดยไม่กำหนดรูปร่างของมันจะมีวิธี:

1

arr = np.array([]) 

แนะนำ เพราะคุณรู้ว่าคุณจะใช้สิ่งนี้เป็นจำนวนมาก

2

arr = []
# and use it as numpy. append to it or etc..

NumPy แปลงนี้เพื่อประเภท np.ndarray [] dimionsionหลังจากนั้นโดยไม่ต้องเสริม

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