2

一般に (n,2) 形状の numpy ndarray を引数として受け取るが、(2,n) または len(2) シーケンス (タプルまたはリスト) を「自動的に」受け取ることもできるいくつかの Python 関数を見てきました。

それはどのようにPython的に達成されますか? これらのケース (たとえば、numpy および scipy モジュールの関数) をチェックして処理するための統一された優れたプラクティスはありますか、または各開発者は自分が最適と考えるものを実装していますか?

よく知られているより良い方法がある場合に備えて、(おそらくネストされた) if/elif のチェーンのチェーンを避けたいと思います。

助けてくれてありがとう。

4

1 に答える 1

6

numpy.asarray関数を使用して、シーケンスのような入力を配列に変換できます。

>>> import numpy
>>> numpy.asarray([1,2,3])
array([1, 2, 3])
>>> numpy.asarray(numpy.array([2,3]))
array([2, 3])
>>> numpy.asarray(1)
array(1)
>>> numpy.asarray((2,3))
array([2, 3])
>>> numpy.asarray({1:3,2:4})
array({1: 3, 2: 4}, dtype=object)

ドキュメントに記載されているように、入力が既に ndarray である場合、コピーは実行されないことに注意することが重要です。既存の配列を渡すことができ、同じ配列を返すだけなので、これは非常に便利です。

それをnumpy配列に変換したら、それが必要な場合は長さを確認してください。何かのようなもの:

>>> def f(x):
...    x = numpy.asarray(x)
...    if len(x) != 2:
...       raise Exception("invalid argument")
... 
>>> f([1,2])
>>> f([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
Exception: invalid argument

更新: あなたが尋ねたので、これは *args を配列としても除外する「魔法の」関数です:

>>> def f(*args):
...    args = numpy.asarray(args[0]) if len(args) == 1 else numpy.asarray(args)
...    return args
... 
>>> f(7,3,5)
array([7, 3, 5])
>>> f([1,2,3])
array([1, 2, 3])
>>> f((2,3,4))
array([2, 3, 4])
>>> f(numpy.array([1,2,3]))
array([1, 2, 3])
于 2012-09-21T23:47:42.043 に答える