Làm thế nào tôi có thể kiểm tra xem một mảng numpy có trống hay không?


169

Làm thế nào tôi có thể kiểm tra xem một mảng numpy có trống hay không?

Tôi đã sử dụng đoạn mã sau, nhưng điều này không thành công nếu mảng chứa số không.

if not self.Definition.all():

Đây có phải là giải pháp?

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

6
len(array( [] ))là 0. len(array( [0] )là 1.
Steven Rumbalski

3
Bạn có muốn kiểm tra một mảng có độ dài bằng không, một mảng chứa tất cả các số không hoặc cả hai không? Định nghĩa của bạn về 'trống rỗng' là gì?
John Lyon

12
@StevenRumbalski: Nhưng len(array([[]])cũng là 1!
strpeter

len()đưa ra số lượng kích thước trong trục đầu tiên. Nhưng một mảng có thể có kích thước khác không ở trục đầu tiên nhưng vẫn trống nếu nó có kích thước bằng 0 ở trục khác. sizelà tốt hơn vì nó là sản phẩm của tất cả các trục.
asmeker

Câu trả lời:


303

Bạn luôn có thể xem .sizethuộc tính. Nó được định nghĩa là một số nguyên và bằng 0 ( 0) khi không có phần tử nào trong mảng:

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

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

4
Điều này là tuyệt vời cho numpy, nhưng không may là nó được coi là unpythonic cho danh sách. Kiểm tra thảo luận cho các danh sách: stackoverflow.com/questions/53513/ Từ Sẽ thật tuyệt khi sử dụng cùng một mẫu cho các mảng và danh sách numpy.
eric

Mã NumPy nói chung không hoạt động đúng trong danh sách hoặc ngược lại. Bạn phải viết mã theo một cách khác nếu bạn đang sử dụng danh sách so với mảng NumPy.
asmeker

22

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

Đối tượng chính của NumPy là mảng đa chiều đồng nhất. Trong kích thước Numpy được gọi là trục. Số lượng trục là cấp bậc. Lớp mảng của Numpy được gọi là ndarray. Nó cũng được biết đến bởi các mảng bí danh. Các thuộc tính quan trọng hơn của một đối tượng ndarray là:

ndarray.ndim
số lượng trục (kích thước) của mảng. Trong thế giới Python, số lượng kích thước được gọi là thứ hạng.

ndarray.shape
kích thước của mảng. Đây là một bộ số nguyên cho biết kích thước của mảng trong mỗi thứ nguyên. Đối với một ma trận có n hàng và m cột, hình dạng sẽ là (n, m). Do đó, chiều dài của hình dạng là thứ hạng hoặc số thứ nguyên, ndim.

ndarray.size
tổng số phần tử của mảng. Điều này tương đương với sản phẩm của các yếu tố hình dạng.


10

Một cảnh báo, mặc dù. Lưu ý rằng np.array (Không có) .size trả về 1! Điều này là do a.size tương đương với np.prod (a.shape), np.array (Không có) .shape là () và một sản phẩm trống là 1.

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

Do đó, tôi sử dụng cách sau để kiểm tra xem một mảng numpy có các phần tử không:

>>> 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
Một mảng chứa Noneđối tượng không phải là một mảng trống, hãy xem câu trả lời ở đây để biết thêm chi tiết
DrBwts

1
@DrBwts không liên quan đến câu trả lời này.
vidstige

@DrBwts Mảng của anh ta không chứa Noneđối tượng. Nhìn vào hình dạng của nó.
Navin

Mảng có hình dạng ()là mảng vô hướng, có chứa một phần tử (vô hướng). Trong ví dụ này, vô hướng là None( Nonekhông có bất kỳ ý nghĩa đặc biệt nào, đây chỉ là một mảng đối tượng). Nó phụ thuộc vào những gì bạn đang làm nhưng rất có thể bạn muốn xem xét các mảng vô hướng là không trống.
asmeker

-1

Tại sao chúng ta muốn kiểm tra nếu một mảng là empty? Mảng không phát triển hoặc thu hẹp trong cùng một danh sách. Bắt đầu với một mảng 'trống' và phát triển với np.appendlà một lỗi người mới thường xuyên.

Sử dụng một danh sách trong if alist:bản lề về giá trị boolean của nó:

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

Nhưng cố gắng làm tương tự với một mảng tạo ra (trong phiên bản 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])tạo ra lỗi mơ hồ khét tiếng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.