(Python) 使用 for 循环创建 'X' 形式 p = [a,b,c] 的点,然后在 p = [a,b,c] [=11 内随机化 a,b,c =] 次使用第二个 for 循环?
(Python) Creating 'X' points of form p = [a,b,c] using a for loop and then randomizing a,b,c within p = [a,b,c] 'Y' times using a second for loop?
我认为这个问题可以由所有人回答,但为了提供更多背景知识,我使用 python 为 rhino 编写代码。我的目标是创建一些由 X 点组成的曲线。这些点还必须 运行 完全位于 10 x 80 x 20 单位直角棱镜内。我从这个开始:
import rhinoscriptsyntax as rs
import random
crvNumber = 300
numRandPts = 5
xLength = 10
yLength = 80
zLength = 20
crvArray = []
crvPtArray = []
for j in range(0,numRandPts):
ptj = [xLength*random.random(),yLength*random.random(),zLength*random.random()]
crvPtArray.append(ptj)
for i in range(0,crvNumber):
curves = rs.AddCurve (crvPtArray, degree = numRandPts)
crvArray.append(curves)
我相信你会立即发现这行不通,因为 运行dom 点的生成发生在第一个 for 循环中,因此,第二个 for 循环只输出同样的 运行dom 曲线 300 次。有谁知道我如何用第一个循环生成特定数量的点,然后在第二个 for 循环中实际分配它们的值,这样我最终得到 300 条带有 j 运行dom 点的曲线?在过去的 2 个小时里,我一直在研究这个问题,但无济于事。我的第一个解决方法是,只生成一组 1000 运行dom 点然后在第二个 for 循环中选择其中的 j 个可能会更简单。但是,我 运行 遇到无法使用此代码从列表中进行选择("list objects are unhashable" 错误)的问题(我基本上从我发现的示例中复制了 for k in random.sample 位在这里):
for j in range(0,randomLevel):
ptj = [xLength*random.random(),yLength*random.random(),zLength*random.random()]
crvPtArray.append(ptj)
for i in range(0,crvNumber):
crvPtArray2 = (crvPtArray[k] for k in random.sample(xrange(0,len(crvPtArray)), numRandPts))
curves = rs.AddCurve (crvPtArray2, degree = numRandPts)
crvArray.append(curves)
从这里开始,我不知何故偶然发现了 python 中的字典主题并对其进行了测试,但找不到一种方法来打印存储在字典中的 "definitions" 列表而不是"words" 用冒号附加到 "definitions"。然后我意识到,即使我能做到这一点,运行domization 仍然会出现在字典中的 for 循环中,而不是生成曲线的 for 循环中(除非我错了,它会 运行domize在第二个 for 循环中)。因此,我尝试使用 pt[j] = [] 生成空白点,并试图以某种方式让 运行domization 在曲线生成 for 循环中发生。不幸的是,我并没有真正取得任何成功,因为此时我已经完全超出了我的理解范围,只是试图编写看起来可行的代码。
有没有办法创建 X 个空白变量或点,然后追溯 define/randomize 它们?有没有办法让我的 set 和 运行dom 示例想法发挥作用?是否有某种疯狂的嵌套编码或可能适用于此的东西?非常感谢你们能提供的任何见解。
(我的代码中有任何非常非常非常非常愚蠢的错误,它们可能是 t运行scriptional,但如果有任何非常愚蠢的错误,那可能是我的错误;))
独立于 rhino
我理解你想要一个 3D 点的 2D 数组。
这是基本的 Python 方式(无依赖性),它是 3D 点列表的列表(本身是三个值的列表)。要获得一条曲线,只需制作一个标准的空 python 列表 pts=[]
,然后在循环中将 3D 点附加到它:
for j in range(0,numRandPts):
pt = [random...,random..., random....] # xyz
pts.append(pt)
现在将其包装到所有曲线的另一个循环中。
crvs=[]
for i in range(0, numCrvs):
pts=[] #these will be overwritten for each new curve
for j in range(0,numRandPts):
pt = [random...,random..., random....] # xyz
pts.append(pt)
crvs.append(pts)
crvs
现在是 3D 点列表的列表。
为了提高速度,您可以使用 numpy
做得更好。查找 numpy.zeros(..) 命令,它允许您生成任意维度的数组,您可以用数字填充它。
我认为这个问题可以由所有人回答,但为了提供更多背景知识,我使用 python 为 rhino 编写代码。我的目标是创建一些由 X 点组成的曲线。这些点还必须 运行 完全位于 10 x 80 x 20 单位直角棱镜内。我从这个开始:
import rhinoscriptsyntax as rs
import random
crvNumber = 300
numRandPts = 5
xLength = 10
yLength = 80
zLength = 20
crvArray = []
crvPtArray = []
for j in range(0,numRandPts):
ptj = [xLength*random.random(),yLength*random.random(),zLength*random.random()]
crvPtArray.append(ptj)
for i in range(0,crvNumber):
curves = rs.AddCurve (crvPtArray, degree = numRandPts)
crvArray.append(curves)
我相信你会立即发现这行不通,因为 运行dom 点的生成发生在第一个 for 循环中,因此,第二个 for 循环只输出同样的 运行dom 曲线 300 次。有谁知道我如何用第一个循环生成特定数量的点,然后在第二个 for 循环中实际分配它们的值,这样我最终得到 300 条带有 j 运行dom 点的曲线?在过去的 2 个小时里,我一直在研究这个问题,但无济于事。我的第一个解决方法是,只生成一组 1000 运行dom 点然后在第二个 for 循环中选择其中的 j 个可能会更简单。但是,我 运行 遇到无法使用此代码从列表中进行选择("list objects are unhashable" 错误)的问题(我基本上从我发现的示例中复制了 for k in random.sample 位在这里):
for j in range(0,randomLevel):
ptj = [xLength*random.random(),yLength*random.random(),zLength*random.random()]
crvPtArray.append(ptj)
for i in range(0,crvNumber):
crvPtArray2 = (crvPtArray[k] for k in random.sample(xrange(0,len(crvPtArray)), numRandPts))
curves = rs.AddCurve (crvPtArray2, degree = numRandPts)
crvArray.append(curves)
从这里开始,我不知何故偶然发现了 python 中的字典主题并对其进行了测试,但找不到一种方法来打印存储在字典中的 "definitions" 列表而不是"words" 用冒号附加到 "definitions"。然后我意识到,即使我能做到这一点,运行domization 仍然会出现在字典中的 for 循环中,而不是生成曲线的 for 循环中(除非我错了,它会 运行domize在第二个 for 循环中)。因此,我尝试使用 pt[j] = [] 生成空白点,并试图以某种方式让 运行domization 在曲线生成 for 循环中发生。不幸的是,我并没有真正取得任何成功,因为此时我已经完全超出了我的理解范围,只是试图编写看起来可行的代码。
有没有办法创建 X 个空白变量或点,然后追溯 define/randomize 它们?有没有办法让我的 set 和 运行dom 示例想法发挥作用?是否有某种疯狂的嵌套编码或可能适用于此的东西?非常感谢你们能提供的任何见解。
(我的代码中有任何非常非常非常非常愚蠢的错误,它们可能是 t运行scriptional,但如果有任何非常愚蠢的错误,那可能是我的错误;))
独立于 rhino
我理解你想要一个 3D 点的 2D 数组。
这是基本的 Python 方式(无依赖性),它是 3D 点列表的列表(本身是三个值的列表)。要获得一条曲线,只需制作一个标准的空 python 列表 pts=[]
,然后在循环中将 3D 点附加到它:
for j in range(0,numRandPts):
pt = [random...,random..., random....] # xyz
pts.append(pt)
现在将其包装到所有曲线的另一个循环中。
crvs=[]
for i in range(0, numCrvs):
pts=[] #these will be overwritten for each new curve
for j in range(0,numRandPts):
pt = [random...,random..., random....] # xyz
pts.append(pt)
crvs.append(pts)
crvs
现在是 3D 点列表的列表。
为了提高速度,您可以使用 numpy
做得更好。查找 numpy.zeros(..) 命令,它允许您生成任意维度的数组,您可以用数字填充它。