python3.10 でデカルト座標のリストを生成する作業を行っています。問題は、生成された 16 の個別の座標のうち、2 番目の 8 つの座標セットが最初の 8 つの座標セットと同一であることです。 16 の座標セットすべてが一意であることを確認するにはどうすればよいですか?私のソリューションは、1,024 座標セットまでスケールアップする必要があります。 numpy.arange() を乱数ジェネレーターと組み合わせて、目的の配列サイズを取得しました。重複は、行列の乗算を実行して行列を 4 次元から 3 次元に縮小した後にのみ発生するようです。現在のコードとその出力は次のとおりです。
numpy を np としてインポート
dims = 4 # ユーザーは 4 ~ 10 の値を入力できます。
マグニチュード = 1 # ユーザーはここに任意の数値を入力できます。
verticesMatrix =
マグニチュード *
(2*((np.arange(2**dimensions)[:,None] &
(1 < 0) - 1)
行 = int(0)
列 = int(0)
投影マトリックス = np.ndarray(
shape=(寸法-1, 寸法), ditype=np.int32)
範囲内の行 (次元-1):
範囲内の列 (寸法):
列 == 行の場合:
射影行列[行、列] = 1
そうしないと:
投影マトリックス[行、列] = 0
myProjection = matrices.projectionMatrix(dims)
myProjectionRows、myProjectionCols = np.shape(myProjection)
myVerticesRows、myVerticesAxes = originalVertices[0].shape
myProjectionCols != myVerticesAxes の場合:
logging.error("射影行列の列数は、
各座標セットの軸の数と同じ
頂点マトリックスから。")
そうしないと:
myFlattenedHypercube = np.empty(
(myVerticesRows、myProjectionRows))
行 = 0
while 行 <= 頂点 - 1:
myFlattenedHypercube[行] = np.matmul(
myProjection, originalVertices[0][行])
行 += 1
元の行列は、テッセラクトまたはハイパーキューブを表す点の座標です。現時点では、この配列は完全に 4 次元 (4D) であり、実質的に x、y、z、w 座標を持っています。 3 次元空間でグラフ化できる一連の座標を取得するには、4 次元を 3 次元に「平坦化」する必要があるため、x、y、z 座標しかありません。
ステップ 1: tesseract の座標を生成します。
ステップ 2: tesseract を 3 次元の「投影」に「平坦化」できるマトリックスを生成します。
ステップ 3: 射影行列に tesseract 行列を掛けると、結果は同じ数の座標セットを持つ配列になりますが、空間には 3 次元しかありません。
私のアルゴリズムは行列の乗算を一度に 1 行ずつ実行します。
A B C D x y z w (A1*x1)+(B1*y1)+(C1*z1)+(D1*w1)= x
1 [1,0,0,0] * 1 [-1,-1,-1,-1] = (1*-1)+ (0*-1)+ (0*-1)+ (0* -1)= -1
2 [0,1,0,0] (A2*x1)+(B2*y1)+(C2*z1)+(D2*w1)=y
3 [0,0,1,0] = (0*-1)+ (1*-1)+ (0*-1)+ (0*-1)= -1
(A3*x1)+(B3*y1)+(C3*z1)+(D3*w1)= z
= (0*-1)+ (0*-1)+ (1*-1)+ (0*-1)= -1
新しい行の座標セットが [-1, -1, -1] として返されるようにします。これは、「返された平坦化されたマトリックス」の行 1 で確認できます。これは、Original VerticesMatrix の追加の行ごとに同じ方法で繰り返されます。問題は、この例では、4D から 3D にフラット化された 8 つの座標セットごとに、8 行前の行の複製が返されることです。
(「生成された元の VerticesMatrix:」、配列(
[[-1, -1, -1, -1],
[ 1, -1, -1, -1],
[-1, 1, -1, -1],
[ 1, 1, -1, -1],
[-1, -1, 1, -1],
[ 1, -1, 1, -1],
[-1, 1, 1, -1],
[ 1, 1, 1, -1],
[-1、-1、-1、1]、
[ 1, -1, -1, 1],
[-1, 1, -1, 1],
[ 1, 1, -1, 1],
[-1, -1, 1, 1],
[ 1, -1, 1, 1],
[-1, 1, 1, 1],
[ 1, 1, 1, 1]]))
('射影行列:', 配列(
[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]))
("平坦化された頂点が返されました:", array(
[[-1., -1., -1.],
[ 1.、-1.、-1.]、
[-1., 1., -1.],
[ 1., 1., -1.],
[-1., -1., 1.],
[ 1., -1., 1.],
[-1., 1., 1.],
[ 1., 1., 1.], # 8番目の座標セットです
[-1., -1., -1.],
[ 1.、-1.、-1.]、
[-1., 1., -1.],
[ 1., 1., -1.],
[-1., -1., 1.],
[ 1., -1., 1.],
[-1., 1., 1.],
[ 1., 1., 1.])) # これは 16 番目の座標セットで、8 番目と同じです。
私は行列乗算の法則に従って、このような不幸な結果をもたらす愚か者でしょうか?
np.ndarray
についての私のコメントは、このコード ブロックと関係がありました:
[4]: ProjectionMatrix = np.ndarray(
...: shape=(寸法-1, 寸法), dtype=np.int32)
...:
...: 範囲内の行 (次元-1):
...: 範囲内の列 (寸法):
...: 列 == 行の場合:
...: 射影行列[行、列] = 1
...: そうしないと:
...: 射影行列[行、列] = 0
...:
[5]: 射影行列
アウト[5]:
配列([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=int32)
このように使用される
ndarray
は、本質的に empty
と同じであり、未定義の値を持つ配列を作成します。まだまだ満員です。 np.zeros
を使用することを好みます (オブジェクト dtype を使用しない場合)。 ndarray
は、低レベルの配列クリエーターです (ドキュメントを参照してください)。
しかし、そのような配列を作成するために反復する必要はありません。 eye
を使用するだけです:
[7]: np.eye(dimensions-1, dimension, dtype=np.int32)
アウト[7]:
配列([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]], dtype=int32)
コードの残りの部分が何をしているのかを把握しようとはしていません.