2

視覚的なSierpinski三角形を3Dプリントに作成するコードを作成しています。そのためには、作成するアルゴリズムを伝えるために配列を作成するPascal三角形アルゴリズムを使用する必要があります私の三角形は三角形を置かないところです。2D配列の行と列を切り替えるにはどうすればよいですか?

とにかく問題は、三角形を配置する私のコードは、パスカルアルゴリズムのように行ではなく三角形を作成するので、パスカル配列を再配置するサブルーチンを使って簡単に修正しようとしています。 index out of rangeのエラーを回避する方法がわからないので、私はそれを行う方法をちょうど困惑しています。

これは、パスカルの三角形の配列を作成するコードです。

TL:DR私は、行、列と列これは、アレイの印刷出力された行

def pascal(n): 
    """Prints out n rows of Pascal's triangle.""" 
    row = [1] 
    global array 
    array = [[0 for x in range(int(n))] for y in range(int(n))] 
    array[0]=row 
    k = [0] 
    for x in range(int(max(n,0)-1)): 
     row=[l+r for l,r in zip(row+k,k+row)] 
     array[x+1]=row 
    return 1 

されている配列を再配置しようとしています。私はちょうどあなたがこのプロジェクトについて興味がある場合は、完全なコードですが、それはモデルを作るためにrhinoscriptsyntaxが必要ですここで行は行

[[1], 
[1, 1], 
[1, 2, 1], 
[1, 3, 3, 1], 
[1, 4, 6, 4, 1], 
[1, 5, 10, 10, 5, 1], 
[1, 6, 15, 20, 15, 6, 1], 
[1, 7, 21, 35, 35, 21, 7, 1]] 

する列と列になりたいです。

import rhinoscriptsyntax as rhino 
import math 

obj = rhino.GetObject("Select object to transform", preselect=True) 
scale = 3 
n=math.pow(3,scale) 
def pascal(n): 
    """Prints out n rows of Pascal's triangle.""" 
    row = [1] 
    global array 
    array = [[0 for x in range(int(n))] for y in range(int(n))] 
    array[0]=row 
    k = [0] 
    for x in range(int(max(n,0)-1)): 
     row=[l+r for l,r in zip(row+k,k+row)] 
     array[x+1]=row 
    return 1 
pascal(math.pow(2,scale)) 
print array 
def remakePascal(): 
    pass 
my_horizontalVector = [[1,0,0,6], 
      [0,1,0,0], 
      [0,0,1,0], 
      [0,0,0,1]] 

my_tsfm = [[1,0,0,0], #identity 
      [0,1,0,0], 
      [0,0,1,0], 
      [0,0,0,1]] 


def makeTriangle(scale,obj): 
    w=1/scale 
    h=1/scale 
    tsfm= [[w,0,0,0], #scale about origin 
      [0,h,0,0], 
      [0,0,1,0], 
      [0,0,0,1]] 
    output= rhino.XformMultiply(my_tsfm,tsfm) 
    new_obj=rhino.TransformObject(obj,output,copy=True) 
    return new_obj 
def placeObj(i): 
    my_moveUpVector = [[1,0,0,(3/scale)*i], 
      [0,1,0,(4/scale)*i], 
      [0,0,1,0], 
      [0,0,0,1]] 
    vector = rhino.XformMultiply(my_tsfm,my_moveUpVector) 
    return vector 
n=0 
for i in range(int(math.pow(2,scale))): 
    if(i>0): 
     hPlace=rhino.XformMultiply(my_tsfm,my_horizontalVector) 
     obj = rhino.TransformObject(obj,hPlace) 
    factor = int(math.pow(2,scale))-n 
    for j in range(factor): 
     if(): 
      pass 
     else: 
      Vertobj=makeTriangle(scale,obj) 
      tsfm = rhino.TransformObject(Vertobj,placeObj(j),copy=True) 
    n=n+1 

答えて

1

示すように、あなたはそれを行うことができます。これは、すべての行が同じ数の要素を持つように最初に配列を正方形にすることによって機能します。組み込みのzip()関数を使用して行と列を転置し、最後に追加した要素を最後に削除します。

また、グローバル変数arrayの使用を削除しました。グローバル変数は避けてください。

from pprint import pprint 

def pascal(n): 
    """Creates n rows of Pascal's triangle.""" 
    array = [None for y in range(n)] 

    row = [1] 
    array[0] = row 
    k = [0] 
    for x in range(max(n, 0)-1): 
     row = [l+r for l,r in zip(row+k, k+row)] 
     array[x+1] = row 

    return array 

def transpose(array): 
    array = array[:] # make copy to avoid changing original 
    n = len(array) 
    for i, row in enumerate(array): 
     array[i] = row + [None for _ in range(n - len(row))] 

    array = zip(*array) 

    for i, row in enumerate(array): 
     array[i] = [elem for elem in row if elem is not None] 

    return array 

array = pascal(8) 
array = transpose(array) 
pprint(array) 

出力:

[[1, 1, 1, 1, 1, 1, 1, 1], 
[1, 2, 3, 4, 5, 6, 7], 
[1, 3, 6, 10, 15, 21], 
[1, 4, 10, 20, 35], 
[1, 5, 15, 35], 
[1, 6, 21], 
[1, 7], 
[1]] 
+0

Iあなたの転置リストの理解がスードコードか実際のコードかどうかは分かりませんでした。私はPythonにはかなり新しいので、それを見なければなりませんでしたが、今、私はSierpinski三角形の実際の人生表現を持つことができます助けてくれてありがとう。 – Dayman

+0

デイマン:いいえ、疑似コードはなく、_Real Thing_™だけです。 ';-)' – martineau

1

あなたは、おそらくこのような何かしたい:

def pascal(n): 
    a = [[int(i==0) for j in range(n)] for i in range(n)] 
    for i in range(n): 
     for j in range(1, 1+i): 
      a[j][i] = a[j][i-1] + a[j-1][i-1] 

    for line in a: print(line) 

pascal(7) 

この版画:正方形の配列を入れ替えるため

[1, 1, 1, 1, 1, 1, 1] 
[0, 1, 2, 3, 4, 5, 6] 
[0, 0, 1, 3, 6, 10, 15] 
[0, 0, 0, 1, 4, 10, 20] 
[0, 0, 0, 0, 1, 5, 15] 
[0, 0, 0, 0, 0, 1, 6] 
[0, 0, 0, 0, 0, 0, 1] 
3

を、簡単な解決策がある

transposed_array = zip(*array) 

このアプローチがありますには適していませんzipのような三角形のデータは、行の長さが等しくない場合にはパディングを挿入しません。

import itertools 
transposed_array = itertools.izip_longest(*array) 

izip_longestパッドNoneとデフォルトでは、あなたが同様の結果を得る:itertools.izip_longestは、しかし、ない

:あなたが希望する場合

[(1, 1, 1, 1, 1), 
(None, 1, 2, 3, 4), 
(None, None, 1, 3, 6), 
(None, None, None, 1, 4), 
(None, None, None, None, 1)] 

、あなたはリスト内包でNoneエントリを削除することができますが

no_nones = [[item for item in row if item is not None] for row in transposed_array] 

あなたにお任せする:

[[1, 1, 1, 1, 1], 
[1, 2, 3, 4], 
[1, 3, 6], 
[1, 4], 
[1]] 

0(または他のもの)で埋めたい場合は、fillvalueキーワード引数をitertools.izip_longestに指定します。例えば

list(itertools.izip_longest(*array, fillvalue=0)) 

戻り

[(1, 1, 1, 1, 1), 
(0, 1, 2, 3, 4), 
(0, 0, 1, 3, 6), 
(0, 0, 0, 1, 4), 
(0, 0, 0, 0, 1)] 

私はタプルのリストがあなたの目的のために働くことをここで想定しています。内部を変更可能にする必要がある場合は、それをリストの理解度で得ることができます。:

list_of_lists = [list(row) for row in transposed_array] 
+0

は、だから、僕は '印刷transposed_array'を使用して、他のアレイのような' transposed_array'を印刷することができますか? – Dayman

+2

はい、できます。 リスト(タプルのリストではない)のリストを取得したい場合は、これを1行に書くことができます: 'list_of_lists = list(map(list、itertools.izip_longest(* array、fillvalue = 0)))' – ADR

0

あなたが最大行に各列の長さに一致し、ゼロで充填した後に行と列を転置することができます。

作業コードは次のとおりです。 numpy_fillna関数のソースはthis SO postです。

import numpy as np 
x = [[1], 
[1, 1], 
[1, 2, 1], 
[1, 3, 3, 1], 
[1, 4, 6, 4, 1], 
[1, 5, 10, 10, 5, 1], 
[1, 6, 15, 20, 15, 6, 1], 
[1, 7, 21, 35, 35, 21, 7, 1]] 

a = np.array(x) 

def numpy_fillna(data): 
    # Get lengths of each row of data 
    lens = np.array([len(i) for i in data]) 

    # Mask of valid places in each row 
    mask = np.arange(lens.max()) < lens[:,None] 

    # Setup output array and put elements from data into masked positions 
    out = np.zeros(mask.shape, dtype=data.dtype) 
    out[mask] = np.concatenate(data) 
    return out 

結果

>>> numpy_fillna(a).T 
array([[1, 1, 1, 1, 1, 1, 1, 1], 
     [0, 1, 2, 3, 4, 5, 6, 7], 
     [0, 0, 1, 3, 6, 10, 15, 21], 
     [0, 0, 0, 1, 4, 10, 20, 35], 
     [0, 0, 0, 0, 1, 5, 15, 35], 
     [0, 0, 0, 0, 0, 1, 6, 21], 
     [0, 0, 0, 0, 0, 0, 1, 7], 
     [0, 0, 0, 0, 0, 0, 0, 1]], dtype=object) 
>>> 
関連する問題