【问题标题】:(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) 使用 for 循环创建 p = [a,b,c] 形式的“X”点,然后使用第二个 for 循环在 p = [a,b,c] 'Y' 次内随机化 a,b,c ?
【发布时间】:2016-03-29 04:50:22
【问题描述】:

我认为这个问题所有人都可以回答,但为了提供更多背景知识,我正在使用 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)

我相信您可以立即发现这是行不通的,因为随机点的生成发生在第一个 for 循环中,因此,第二个 for 循环仅输出相同的随机曲线 300 次。有谁知道我如何用第一个循环生成特定数量的点,然后在第二个 for 循环中实际分配它们的值,这样我最终得到 300 条带有 j 个随机点的曲线?在过去的 2 个小时里,我一直在研究这个,但无济于事。我的第一个解决方法是,只生成一组比如说 1000 个随机点然后在第二个 for 循环中选择其中的 j 个可能会更简单。但是,我遇到了无法使用此代码从列表中选择的问题(“列表对象不可散列”错误)(我基本上从我在这里找到的示例中复制了 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 中的字典主题并对其进行了测试,但找不到仅打印存储在字典中的“定义”列表而不是冒号附加的“单词”的方法到“定义”。然后我意识到,即使我能做到这一点,随机化仍然会发生在字典 for 循环中,而不是曲线生成 for 循环中(除非我错了,它会在第二个 for 循环中随机化)。因此,我尝试使用 pt[j] = [] 生成空白点,并尝试以某种方式使随机化发生在生成曲线的 for 循环中。不幸的是,我并没有真正取得任何成功,因为此时我完全超出了我的深度,只是试图编写看起来可能有效的代码。

有没有办法创建 X 个空白变量或点,然后追溯定义/随机化它们?有没有办法让我的集合和随机样本想法发挥作用?是否有某种疯狂的嵌套编码或可能适用于此的东西?非常感谢你们提供的任何见解。

(我的代码中有任何非常非常愚蠢的错误,它们可能是转录错误,但如果有任何非常愚蠢的错误,那可能是我的;))

【问题讨论】:

  • 嵌套两个循环不是简单的解决方案吗?也就是说,为每条曲线重复生成随机点?

标签: python for-loop random random-sample rhinoceros


【解决方案1】:

独立于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(..) 命令,该命令允许您生成任意维度的数组,您可以用数字填充该数组。

【讨论】:

  • 非常感谢您的帮助!不敢相信我看不到这个。一定是因为工作这么久而对代码视而不见。
猜你喜欢
  • 2012-11-11
  • 2015-06-12
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多