2

私はPythonに比較的慣れていませんが、基本的なことを理解しようとしています。

ベクトルを作成します。

x = np.linspace(0,2,3)
Out[38]: array([ 0.,  1.,  2.])

x[:,0] が値の引数ではないのはなぜですか?

IndexError: invalid index

x[0] でなければなりません。私は計算する関数を呼び出しています:

np.sqrt(x[:,0]**2 + x[:,1]**2 + x[:,2]**2)

入力に関係なく、なぜ私が持っているものが真実ではないのですか? 他の多くの言語では、配列内の他の行とは無関係です。おそらく私は何か基本的なことを誤解しています - もしそうなら申し訳ありません。私は置くことを避けたい:

if len(x) == 1:
    norm = np.sqrt(x[0]**2 + x[1]**2 + x[2]**2)
else:
    norm = np.sqrt(x[:,0]**2 + x[:,1]**2 + x[:,2]**2)

どこにでも。確かにこれを回避する方法があります...ありがとう。

編集:別の言語で動作する例はMatlabです:

>> b = [1,2,3]
b =
     1     2     3 
>> b(:,1)
ans =
     1
>> b(1)
ans =

     1
4

4 に答える 4

7

@JanneKarila で説明されている省略記号があなたの質問に答えているように見えますが、コードをもう少し「numpythonic」にする方法を指摘したいと思います。形状 (d_1, d_2, ..., d_{n-1}, 3) の n 次元配列を処理し、この 3 次元ベクトルのコレクションの大きさを計算して、(形状 (d_1、d_2、...、d_{n-1}) を持つ n-1) 次元配列。これを行う簡単な方法の 1 つは、すべての要素を 2 乗し、最後の軸に沿って合計してから平方根を取ることです。が配列の場合x、その計算は と書くことができますnp.sqrt(np.sum(x**2, axis=-1))。以下にいくつかの例を示します。

x は 1 次元で、形状は (3,) です。

In [31]: x = np.array([1.0, 2.0, 3.0])

In [32]: np.sqrt(np.sum(x**2, axis=-1))
Out[32]: 3.7416573867739413

x は 2 次元で、形状は (2, 3) です。

In [33]: x = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])

In [34]: x
Out[34]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

In [35]: np.sqrt(np.sum(x**2, axis=-1))
Out[35]: array([ 3.74165739,  8.77496439])

x は 3 次元で、形状は (2, 2, 3) です。

In [36]: x = np.arange(1.0, 13.0).reshape(2,2,3)

In [37]: x
Out[37]: 
array([[[  1.,   2.,   3.],
        [  4.,   5.,   6.]],

       [[  7.,   8.,   9.],
        [ 10.,  11.,  12.]]])

In [38]: np.sqrt(np.sum(x**2, axis=-1))
Out[38]: 
array([[  3.74165739,   8.77496439],
       [ 13.92838828,  19.10497317]])
于 2013-05-13T20:52:52.660 に答える