numpy配列が空かどうかを確認するにはどうすればよいですか?


169

numpy配列が空かどうかを確認するにはどうすればよいですか?

次のコードを使用しましたが、配列にゼロが含まれていると失敗します。

if not self.Definition.all():

これは解決策ですか?

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

6
len(array( [] ))is is 0 len(array( [0] )is is 1
Steven Rumbalski

3
長さゼロの配列、すべてゼロを含む配列、またはその両方をテストしますか?「空」の定義は何ですか?
ジョンリヨン

12
@StevenRumbalski:でもlen(array([[]])1です!
strpeter 2014

len()最初の軸の次元数を与える。ただし、配列は最初の軸にゼロ以外の次元を持つことができますが、別の軸にゼロ次元がある場合でも空のままにすることができます。sizeすべての軸の製品であるため、より優れています。
asmeurer

回答:


303

いつでも.size属性を確認できます。これは整数として定義され0、配列に要素がない場合はゼロ()になります。

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

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

4
これはnumpyには最適ですが、リストではPythonとは見なされないので残念です。リストのディスカッションをチェックしてください:stackoverflow.com/questions/53513/…numpyの 配列とリストに同じパターンを使用するとよいでしょう。
エリック

NumPyコードは一般にリストで正しく機能しません。逆の場合も同様です。リストとNumPy配列を使用している場合は、別の方法でコードを記述する必要があります。
asmeurer

22

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

NumPyの主なオブジェクトは同種の多次元配列です。Numpyでは次元は軸と呼ばれます。軸数はランクです。Numpyの配列クラスはndarrayと呼ばれます。別名配列でも知られています。ndarrayオブジェクトのより重要な属性は次のとおりです。

ndarray.ndim
配列の軸(次元)の数。Pythonの世界では、次元の数はランクと呼ばれます。

ndarray.shape
配列の次元。これは、各次元の配列のサイズを示す整数のタプルです。n行m列の行列の場合、形状は(n、m)になります。したがって、形状タプルの長さは、ランクまたは次元数ndimです。

ndarray.size
は、配列の要素の総数です。これは形の要素の積に等しい。


10

ただし、注意点が1つあります。np.array(None).sizeは1を返すことに注意してください。これは、a.size np.prod(a.shape)と同等であり、np.array(None).shapeが()であり、空の積が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

形状()を持つ配列は、要素(スカラー)を含むスカラー配列です。この例では、スカラーはNoneNone特別な意味はありません。これは単なるオブジェクト配列です)。それはあなたが何をしているのかに依存しますが、おそらくスカラー配列を空ではないと見なしたいと思うでしょう。
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.