とあるlibraryに配列を渡さないといけないのですが、どうやら内部でその配列を真偽値判定しているようでnumpy配列をそのまま渡すとThe truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
と怒られます。そこで現在とっている対策がtuple(numpyの配列)
という風にtupleに変換してしまうやり方なのですが、これを毎frame行う羽目になるのであまりいい気分がしません。(作っているのはGUIプログラムで描画毎にこの変換が入ってしまう)。
最初に試した方法
そこで最初に試したのがnumpy配列に独自の__bool__()
を実装させる方法なのですが
numpyの配列.__bool__ = lambda: numpyの配列.size > 0
これはAttributeError: 'numpy.ndarray' object attribute '__bool__' is read-only
で駄目でした。
次に試した方法
次にproxy objectをかませてみたところ
python
1class NumpyArrayWrapper: 2 def __init__(self, numpy_arr): 3 self.__dict__['_numpy_arr'] = numpy_arr 4 def __getattr__(self, name): 5 return getattr(self._numpy_arr, name) 6 def __setattr__(self, name, value): 7 return setattr(self._numpy_arr, name, value) 8 def __bool__(self): 9 return self._numpy_arr.size > 0 10 def __iter__(self): 11 return iter(self._numpy_arr)
これは問題なく動きました。
質問
こんなことをせずとももっと簡単な方法があるのなら教えてほしいです。
環境
- CPython 3.7.1
- Numpy 1.18.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/08 13:51