ฉันจะตรวจสอบว่าอาร์เรย์ numpy ว่างเปล่าได้หรือไม่?


169

ฉันจะตรวจสอบว่าอาร์เรย์ numpy ว่างเปล่าได้หรือไม่?

ฉันใช้รหัสต่อไปนี้ แต่สิ่งนี้ล้มเหลวหากอาร์เรย์มีศูนย์

if not self.Definition.all():

นี่เป็นทางออกหรือไม่?

if self.Definition == array( [] ):

6
len(array( [] ))คือ 0 len(array( [0] )คือ 1
Steven Rumbalski

3
คุณต้องการทดสอบอาเรย์ที่มีความยาวเป็นศูนย์อาเรย์ที่มีศูนย์ทั้งหมดหรือทั้งสองอย่าง? คำจำกัดความของคุณของ 'ว่าง' คืออะไร?
John Lyon

12
@StevenRumbalski: แต่len(array([[]])ก็เป็น 1 ด้วย!
นักเลง

len()ให้จำนวนมิติในแกนแรก แต่อาร์เรย์สามารถมีมิติที่ไม่เป็นศูนย์ในแกนแรก แต่ยังคงว่างเปล่าถ้ามีมิติเป็นศูนย์ในแกนอื่น sizeดีกว่าเนื่องจากเป็นผลิตภัณฑ์ของทุกแกน
asmeurer

คำตอบ:


303

คุณสามารถดู.sizeแอตทริบิวต์ได้ตลอดเวลา มันถูกกำหนดให้เป็นจำนวนเต็มและเป็นศูนย์ ( 0) เมื่อไม่มีองค์ประกอบในอาร์เรย์:

import numpy as np
a = np.array([])

if a.size == 0:
    # Do something when `a` is empty

4
นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับผู้ที่มีรสนิยมสูง แต่โชคร้ายที่มันถูกมองว่าไม่มีความสำคัญสำหรับรายการ ตรวจสอบการสนทนาสำหรับรายการ: stackoverflow.com/questions/53513/… มันจะดีถ้าใช้รูปแบบเดียวกันสำหรับอาร์เรย์และรายการที่มีจำนวนมาก
eric

โดยทั่วไปรหัส NumPy ทำงานไม่ถูกต้องในรายการหรือในทางกลับกัน คุณต้องเขียนโค้ดด้วยวิธีอื่นถ้าคุณใช้รายการกับ NumPy อาร์เรย์
asmeurer

22

http://www.scipy.org/Tentative_NumPy_Tutorial#head-6a1bc005bd80e1b19f812e1e64e0d25d50f99fe2

วัตถุหลักของ NumPy คืออาเรย์หลายมิติที่เป็นเนื้อเดียวกัน ในขนาด Numpy เรียกว่าแกน จำนวนแกนคืออันดับ คลาสอาเรย์ของ Numpy เรียกว่า ndarray มันเป็นที่รู้จักกันโดยอาร์เรย์นามแฝง คุณลักษณะที่สำคัญของวัตถุ ndarray คือ:

ndarray.ndim
จำนวนแกน (ขนาด) ของอาร์เรย์ ในโลกหลามจำนวนมิติจะถูกเรียกว่าอันดับ

ndarray.shape
ขนาดของอาร์เรย์ นี่คือ tuple ของจำนวนเต็มที่ระบุขนาดของอาร์เรย์ในแต่ละมิติ สำหรับเมทริกซ์ที่มี n แถวและคอลัมน์ m รูปร่างจะเป็น (n, m) ความยาวของ tuple รูปร่างจึงเป็นอันดับหรือจำนวนมิติ ndim

ndarray.size
จำนวนองค์ประกอบทั้งหมดของอาร์เรย์ นี่เท่ากับผลคูณขององค์ประกอบของรูปร่าง


10

หนึ่งข้อแม้แม้ว่า โปรดทราบว่า np.array (ไม่มี) ขนาดผลตอบแทน 1! นี่คือเนื่องจาก a.size เทียบเท่ากับ np.prod (a.shape), np.array (None) .shape is () และผลิตภัณฑ์เปล่าคือ 1

>>> import numpy as np
>>> np.array(None).size
1
>>> np.array(None).shape
()
>>> np.prod(())
1.0

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

>>> def elements(array):
    ...     return array.ndim and array.size

>>> elements(np.array(None))
0
>>> elements(np.array([]))
0
>>> elements(np.zeros((2,3,4)))
24

8
อาร์เรย์ที่มีNoneวัตถุไม่ใช่อาร์เรย์ว่างดูคำตอบที่นี่สำหรับรายละเอียดเพิ่มเติม
DrBwts

1
@DrBwts ที่ไม่เกี่ยวข้องกับคำตอบนี้
vidstige

@DrBwts อาร์เรย์ของเขาไม่มีNoneวัตถุ ดูรูปร่างของมัน
Navin

อาร์เรย์ที่มีรูปร่าง()คืออาร์เรย์สเกลาร์ซึ่งประกอบด้วยองค์ประกอบ (สเกลาร์) ในตัวอย่างนี้ scalar คือNone( Noneไม่มีความหมายพิเศษใด ๆ นี่เป็นเพียงอาร์เรย์วัตถุ) มันขึ้นอยู่กับสิ่งที่คุณกำลังทำอยู่ แต่คุณมักจะต้องการที่จะพิจารณาอาร์เรย์สเกลาร์ว่าไม่ว่างเปล่า
asmeurer

-1

ทำไมเราต้องการตรวจสอบว่าอาร์เรย์คือemptyอะไร? อาร์เรย์ไม่เติบโตหรือหดตัวในลักษณะเดียวกับที่รายการทำ เริ่มต้นด้วยอาร์เรย์ 'ว่างเปล่า' และการเติบโตด้วยnp.appendเป็นข้อผิดพลาดสามเณรบ่อยครั้ง

การใช้รายการในif alist:บานพับกับค่าบูลีน:

In [102]: bool([])                                                                       
Out[102]: False
In [103]: bool([1])                                                                      
Out[103]: True

แต่พยายามทำเช่นเดียวกันกับอาร์เรย์ที่สร้าง (ในเวอร์ชั่น 1.18):

In [104]: bool(np.array([]))                                                             
/usr/local/bin/ipython3:1: DeprecationWarning: The truth value 
   of an empty array is ambiguous. Returning False, but in 
   future this will result in an error. Use `array.size > 0` to 
   check that an array is not empty.
  #!/usr/bin/python3
Out[104]: False

In [105]: bool(np.array([1]))                                                            
Out[105]: True

และbool(np.array([1,2])สร้างข้อผิดพลาดที่น่าสงสัยอย่างน่าอับอาย

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