numpyのアレイが最も効率的である、または彼らは一定のTYを持って、少なくとも場合は、よりエレガントな解決策が存在しなければなりませんそれらに関連するパターン。値の配列をdtype=object
のnumpyの配列で保持することができますが、これはおそらくnumpyで行うのが最も効率的ではありません。
これに対応して、各要素の型にアクセスできる効率的な(ネイティブnumpy)メソッド(私が知っている)はありません。これは単にnumpyを使用するときに通常起こるものではありません。
私はあなたのコードをよりエレガントにするために考えることができる唯一の方法は、ダブルループを関数呼び出しに変換することです。私はmap
を使用しますが、これはネイティブのnumpy関数(これはC言語でコンパイルされるため)はまだ高速ではありませんが、おそらくPythonの二重ループより速く、より明確です。
あなたの例データは長方形ではありません。すなわち、2dのnumpy配列に変換することはできませんが、試してみると難しいです。私はあなたがMCVEをまとめる際に間違いを犯したと仮定し、サンプルデータの4行目から1つの要素を削除しました(その結果、配列(4,7)
の形になります)。
import numpy as np
# dummy data as nested list, make sure it's rectangular
datlist = [[0.03829744, 0.0, True, False, True, True, 6.0],
[0.0, 0.0, True, False, True, True, 6.0],
[0.09174341, 0.0, True, False, True, True, 6.0],
[0.03489284, 0, True, True, False, 0, 6.0]] #dropped an element here
# create a numpy array of dtype object from datlist
dat = np.array(datlist,dtype=object)
私は、これがあなたの出発点であるとあなたの例から集めました。さて、私は、配列の要素の値と型をチェックし、非boolのゼロについて-1を返す関数を定義します。
def zeroswap(elem):
# replace non-bool zeros with -1, leave the rest alone
return -1 if elem==0 and elem is not False else elem
dat.ravel()[:] = list(map(zeroswap,dat.ravel())) #list() needed for python3
結果の配列は次のようになります:
array([[0.03829744, -1, True, False, True, True, 6.0],
[-1, -1, True, False, True, True, 6.0],
[0.09174341, -1, True, False, True, True, 6.0],
[0.03489284, -1, True, True, False, -1, 6.0]], dtype=object)
ご覧のとおり、フロートの両方と、この関数は、全体のデータ範囲にアクセスするために.ravel()
を利用して、あなたの配列にmap
PEDすることができ整数のゼロは-1に変換されました。これは私には意味をなさないものです。それは、False
のゼロ以外をチェックしたことによるものです。 2種類の数値の零点を区別したい場合は、zeroswap
関数で簡単に行うことができます。 bool値を切り替える場合は、その値を変更することもできます。ここで0.0 -> -1
、0 -> -1
、False -> 0
、True -> 1
、other -> other
を変えていく、アップグレード機能です:
def zeroswap(elem):
if type(elem) is bool:
return int(elem)
elif elem==0:
return -1
else:
return elem
あなたはそれはあなたがそれを行うことを期待していることを確認するために、様々な要素にこの関数を呼び出して遊ぶことができます。結論としては、配列の次元数を知らなくても操作できるように、配列の階段状のバージョンに対してmap
の機能が必要です。
'np.array'には同じタイプのデータしか含まれていません。したがって、 'int'を' bool'とすると 'bool'を' int'にキャストします – MMF
[Python:False vs 0]の可能な複製(http://stackoverflow.com/questions/27431249/python -false-vs-0) – SiHa
@SiHaこれは素晴らしいリンクですが、このナンシー問題にはあまり関係ありません。 –