2

私は初心者で、Python 2.7.2でNumpyを使って何かを試していましたが、期待どおりに機能していなかったので、私が誤解している基本的なものがあるかどうかを確認したいと思いました。

三角形(trinormals)の値を計算してから、三角形インデックスの配列(trivertexidx)を使用して、三角形(vertnormals)のポイントごとの値を更新していました。ループとして私は計算していました:

    for itri in range(ntriangles) :
        vertnormals[(trivertidx[itri,0]),:] += trinormals[itri,:]
        vertnormals[(trivertidx[itri,1]),:] += trinormals[itri,:]
        vertnormals[(trivertidx[itri,2]),:] += trinormals[itri,:]

これは少し遅かったので、私はそれを次のように変更できると思いました:

    vertnormals[(trivertidx[:,0]),:] += trinormals[:,:]
    vertnormals[(trivertidx[:,1]),:] += trinormals[:,:]
    vertnormals[(trivertidx[:,2]),:] += trinormals[:,:]

ただし、これでは同じ結果は得られません。ループを作成する別の簡単な方法はありますか?どんなポインタでもありがたいです。ここでの目的は、vertnormalsの各エントリに対して単一の値を取得し、結果を正規化することであることに注意してください。

4

2 に答える 2

1

私があなたの質問をよく理解しているなら、あなたはあなたが三角形mを形成した点を持っており、範囲内の値を保持する形状の配列です。ここで、は-番目の三角形を構成する3つの点のリストです。ntrivertidx(n, 3)[0, m)trivertidx[j]j

trinormals次に、は(n,)各三角形に割り当てられた値を保持する形状の配列であり、各点について、その点が頂点である各三角形に割り当てられた値の合計を保持するvertnormals形状の配列になります。(m,)

上記が正しければ、次の例は、2番目のコードが正しく機能しない理由を示しているはずです。

>>> a = np.arange(5)
>>> a
array([0, 1, 2, 3, 4])
>>> a[[1,2,0,2]] += 1
>>> a
array([1, 2, 3, 3, 4])

位置の要素が2左側に2回表示されていても、同じ値の2つのコピーが1追加され、増分された値が同じ位置に2回コピーされます。

この合計をベクトル化するには、頂点が三角形の一部である場合は(n, m)位置の値がそうでない場合は、形状の配列が必要になります。この配列は次のように作成できます。[j, k]TruekjFalse

trivert = np.zeros((n, m), dtype='bool')
trivert[np.arange(n).reshape(n, 1), trivertidx] = 1

この配列を取得すると、各頂点の合計を次のように取得できます。

vertnormals = np.sum(trivert * trinormals.reshape(-1, 1), axis=0)
于 2013-01-02T13:39:11.557 に答える
1

Numpyには、bincountこのような状況で非常に役立つ機能があります。以下の2つの線は、の要素indexが一意である場合は同じですが、index値が繰り返されている場合は異なります。

A[index] += W
A += np.bincount(index, W, minlenght=len(A))

2番目の動作が必要だと思いますが、A、index、およびWは1dではないため、コードはもう少し複雑です。あなたはこのようなことを試すことができます、

import numpy as np
N = len(vertnormals)
for j in range(vertnormals.shape[-1]):
    vertnormals[:, j] += np.bincount(trivertidx[:, 0], trinormals[:, j], minlength=N)
    vertnormals[:, j] += np.bincount(trivertidx[:, 1], trinormals[:, j], minlength=N)
    vertnormals[:, j] += np.bincount(trivertidx[:, 2], trinormals[:, j], minlength=N)

お役に立てば幸いです。

于 2013-01-02T18:29:57.873 に答える