2

Pythonの標準max関数(キーパラメーターを渡すこともできます):

s = numpy.array(['one','two','three'])
max(s) # 'two' (lexicographically last)
max(s, key=len) # 'three' (longest string)

大きい(多次元)配列では使えなくなっmaxたので使ってみましたが、文字列numpy.amaxでは使えないようですamax...

t = np.array([['one','two','three'],['four','five','six']])
t.dtype # dtype('|S5')
numpy.amax(t, axis=0) #Error! Hoping for: [`two`, `six`]

Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 1833, in amax
        return amax(axis, out)
TypeError: cannot perform reduce with flexible type

使用することは可能ですかamax間違って使用しています!)、またはnumpyこれを行うための他のツールはありますか?

4

1 に答える 1

6

文字列を可変長データとしてnumpy配列に格納する代わりに、Pythonとして格納してみることができますobject。Numpyはこれらを元のPython文字列オブジェクトへの参照として扱い、期待どおりに扱うことができます。

t = np.array([['one','two','three'],['four','five','six']], dtype=object)
np.min(t)
# gives 'five'
np.max(t)
# gives 'two'

ここで、np.minandnp.max呼び出しは文字列を辞書式順序で並べていることに注意してください。したがって、「2」は実際には「5」の後に続きます。比較演算子を変更して各文字列の長さを確認するにはnumpy、形式は同じですが、参照ではなく各文字列の長さを含む新しい配列を作成してみてください。次に、numpy.argminその配列(最小値のインデックスを返す)を呼び出して、元の配列の文字列の値を検索できます。


コード例:

# Vectorize takes a Python function and converts it into a Numpy
# vector function that operates on arrays
np_len = np.vectorize(lambda x: len(x))

np_len(t)
# gives array([[3, 3, 5], [4, 4, 3]])

idx = np_len(t).argmin(0) # get the index along the 0th axis
# gives array([0, 0, 1])

result = t
for i in idx[1:]:
    result = result[i]
print result
# gives "two", the string with the smallest length
于 2012-09-29T15:48:27.437 に答える