1

私は Python の初心者です (以前は Mathematica、Maple、または Matlab スクリプトを使用していました)。NumPy が配列に対して関数を評価できる方法に非常に感銘を受けましたが、複数の次元で実装しようとすると問題が発生しました。私の質問は非常に単純です (笑わないでください):ループを使用せずに関数 f (R^2 で定義される) を評価するよりエレガントで効率的な方法はありますか?

import numpy    
M=numpy.zeros((10,10))
for i in range(0,10):
    for j in range(0,10):
        M[i,j]=f(i,j)
return M
4

4 に答える 4

0

はい、多くの numpy 関数は N 次元配列で動作します。次の例を見てください。

>>> M = numpy.zeros((3,3))
>>> M[0][0] = 1
>>> M[2][2] = 1
>>> M
array([[ 1.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  1.]])
>>> M > 0.5
array([[ True, False, False],
       [False, False, False],
       [False, False,  True]], dtype=bool)
>>> numpy.sum(M)
2.0

N 次元配列を操作する numpy.sum と、1 レベルの深さしかない sum の違いに注意してください。

>>> sum(M)
array([ 1.,  0.,  1.])

したがって、n 次元配列で機能する操作から関数 f() を作成すると、f() 自体が n 次元配列で機能します。

于 2013-05-08T03:44:32.030 に答える
0

numpy ツールに依存しない純粋な python の答えは、2 つのシーケンスのデカルト積を作成することです。

from itertools import product
for i, j in product(range(0, 10), range(0, 10)):
    M[i,j]=f(i,j)

編集:実際には、質問を適切に読むべきでした。これはまだループを使用していますが、ループが 1 つ少ないだけです。

于 2013-05-08T03:55:21.727 に答える
0

以下のように、numpy 多次元スライスを使用することもできます。各次元にスライスを提供するだけです。

arr = np.zeros((5,5)) # 5 rows, 5 columns

# update only first column
arr[:,0] = 1

# update only last row ... same as arr[-1] = 1
arr[-1,:] = 1

# update center
arr[1:-1, 1:-1] = 1

print arr

出力:

array([[ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  0.],
       [ 1.,  1.,  1.,  1.,  1.]])
于 2013-05-08T03:46:49.223 に答える