2

低く、見よ、1.5.1にアップグレードした後、numpy.chooseでリグレッションが発生しました。過去のバージョン(および数値)は、私が知る限り、無制限の数の潜在的な選択肢をサポートしていました。「新しい」選択は32に制限されています。 これは別のユーザーがリグレッションを嘆く投稿です。

配列を変更するために使用していた100の選択肢(0〜99)のリストがあります。回避策として、次のコードを使用しています。当然のことながら、chooseを使用するよりも7倍遅くなります。私はCプログラマーではありません。厄介な問題を修正するつもりですが、他に潜在的に高速な回避策が他にあるのではないかと思います。考え?

d={...} #A dictionary with my keys and their new mappings
for key, value in d.iteritems():
    array[array==key]=value 
4

4 に答える 4

2

dの鍵0を持っているものを集めます99。その場合、解決策は本当に簡単です。まず、の値をdNumPy配列valuesに次のように記述しますd[i] == values[i]。これは、とにかくこれらの値の自然なデータ構造のようです。次に、値を次のように置き換えて新しい配列にアクセスできます

values[array]

その場で変更したい場合はarray、単に実行してください

array[:] = values[array]
于 2012-07-19T22:28:07.610 に答える
2

Numpyのドキュメントには、choose関数の簡略化されたバージョンがどのように見えるかの例があります。

[...]この関数は、次のコードの説明(ndi = numpy.lib.index_tricksの下)からわかるほど単純ではありません。

np.choose(a,c) == np.array([c[a[I]][I] for I in ndi.ndindex(a.shape)]).

https://docs.scipy.org/doc/numpy/reference/generated/numpy.choose.htmlを参照してください

これを関数に入れると、次のようになります。

import numpy

def choose(selector, choices):
    """
    A simplified version of the numpy choose function to workaround the 32
    choices limit.
    """
    return numpy.array([choices[selector[idx]][idx] for idx in numpy.lib.index_tricks.ndindex(selector.shape)]).reshape(selector.shape)

これが効率の観点からどのように変換されるのか、そして関数と比較したときにこれが正確にいつ崩壊するのかはわかりませんnumpy.choose。しかし、それは私にとってはうまくいきました。パッチが適用された関数は、選択肢のエントリが添字可能であることを前提としていることに注意してください。

于 2019-06-18T09:57:23.350 に答える
0

効率についてはよくわかりませんが、適切ではありません(nb:numpyを頻繁に使用することはないので、やや錆びています):

import numpy as np

d = {0: 5, 1: 3, 2: 20}
data = np.array([[1, 0, 2], [2, 1, 1], [1, 0, 1]])
new_data = np.array([d.get(i, i) for i in data.flat]).reshape(data.shape) # adapt for list/other
于 2012-07-19T22:47:02.410 に答える
0

マウス胚の顕微鏡画像を着色するときchoose、選択肢の数が数百(数百のマウス胚細胞)である実装の必要性に遭遇しました。

https://github.com/flatironinstitute/mouse_embryo_labeller

上記の提案が一般的であるか速いかわからなかったので、私はこの代替案を書きました:

import numpy as np

def big_choose(indices, choices):
    "Alternate to np.choose that supports more than 30 choices."
    indices = np.array(indices)
    if (indices.max() <= 30) or (len(choices) <= 31):
        # optimized fallback
        choices = choices[:31]
        return np.choose(indices, choices)
    result = 0
    while (len(choices) > 0) and not np.all(indices == -1):
        these_choices = choices[:30]
        remaining_choices = choices[30:]
        shifted_indices = indices + 1
        too_large_indices = (shifted_indices > 30).astype(np.int)
        clamped_indices = np.choose(too_large_indices, [shifted_indices, 0])
        choices_with_default = [result] + list(these_choices)
        result = np.choose(clamped_indices, choices_with_default)
        choices = remaining_choices
        if len(choices) > 0:
            indices = indices - 30
            too_small = (indices < -1).astype(np.int)
            indices = np.choose(too_small, [indices, -1])
    return result

一般化された関数は、可能な場合は基礎となる実装を使用することに注意してください。

于 2021-09-28T13:26:45.930 に答える