Day*_*man 5 python arrays algorithm multidimensional-array pascals-triangle
我正在编写一个代码,它将创建一个可视化的谢尔宾斯基三角形以进行 3D 打印,为了使其工作,我必须使用将创建数组的 Pascal 三角形算法,以便我可以用来告诉我的算法将创建我的三角形不放三角形的地方。
无论如何,问题是,我排列三角形的代码按列而不是像 Pascal 算法那样按行创建三角形,所以我只是想通过重新排列 Pascal 数组的子例程来快速修复。我只是被难住了如何去做,因为我不知道如何避免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
Run Code Online (Sandbox Code Playgroud)
这是打印数组的输出。我只希望行是列,列是行
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
Run Code Online (Sandbox Code Playgroud)
如果您对该项目感到好奇,这里是完整代码,但它需要rhinoscriptsyntax
制作模型。
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
Run Code Online (Sandbox Code Playgroud)
对于转置方形阵列,简单的解决方案是
transposed_array = zip(*array)
Run Code Online (Sandbox Code Playgroud)
这种方法不适合三角形数据,因为zip
当行长度不等时不会插入填充。itertools.izip_longest确实如此,但是:
import itertools
transposed_array = itertools.izip_longest(*array)
Run Code Online (Sandbox Code Playgroud)
默认情况下,使用izip_longest
填充None
,因此您会得到如下结果:
[(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)]
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以None
使用列表理解删除条目:
no_nones = [[item for item in row if item is not None] for row in transposed_array]
Run Code Online (Sandbox Code Playgroud)
这让你有:
[[1, 1, 1, 1, 1],
[1, 2, 3, 4],
[1, 3, 6],
[1, 4],
[1]]
Run Code Online (Sandbox Code Playgroud)
如果你喜欢用0(或其他任何东西)垫,指定为fillvalue
关键字参数itertools.izip_longest
; 例如
list(itertools.izip_longest(*array, fillvalue=0))
Run Code Online (Sandbox Code Playgroud)
返回
[(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)]
Run Code Online (Sandbox Code Playgroud)
我在这里假设元组列表适用于您的目的。如果您需要内部可变,您可以通过列表理解来获得它,例如:
list_of_lists = [list(row) for row in transposed_array]
Run Code Online (Sandbox Code Playgroud)
你可以如图所示进行。它的工作原理是首先将数组变成正方形,以便所有行都具有相同数量的元素。然后使用内置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)
Run Code Online (Sandbox Code Playgroud)
输出:
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)
Run Code Online (Sandbox Code Playgroud)