繁体   English   中英

以下两个 python for 循环之间的逻辑区别是什么?

[英]What is the logical difference between the below two python for loops?

我有一个名为 circles 的 numpy 数组,其第三列由半径值组成

circles=[
1358    254 113
1630    282 89
994     132 108
1204    742 103
976     638 100
1696    500 119
1256    468 106
1434    642 119]

def get_radius(circles):
    radii=[]
    for coordinates in circles[0,:]:
        radii.append(coordinates[2])
    return radii

上面的 function 给了我 output

半径= [113, 89, 108, 103, 100, 119, 106, 119]

根据我的理解,下面的代码还应该提供上述半径值 [113, 89, 108, 103, 100, 119, 106, 119]

def get_radius(circles):
    radii=[]
    for coordinates in circles:
        radii.append(coordinates[2])
    return radii

但它提供半径=[994 132 108]

在第一个循环中,您实际上是在创建一个仅包含最后一列的新列表并对其进行迭代,这就是为什么结果

在第二个循环中,您将变量 circle 作为一个整体使用,因此当您遍历它时,它似乎只是将其视为一个 object,而您只是将其附加到第二列

至少这是我的理解

你拥有的数组是

circles = np.array(
    [
        [
        [1358, 254, 113],
        [1630, 282, 89],
        [994, 132, 108],
        [1204, 742, 103],
        [976, 638, 100],
        [1696, 500, 119],
        [1256, 468, 106],
        [1434, 642, 119]
        ]
    ]
)


print(circles.shape)

# Prints
# (1, 8, 3)

该数组具有三个维度,我们称它们为xyz

如果我们做circles[0,:] ,这将采用x的第一个元素(它只有一个元素,其他维度中的所有其他元素:

print(circles[0,:])

# Prints
# [[1358  254  113]
#  [1630  282   89]
#  [ 994  132  108]
#  [1204  742  103]
#  [ 976  638  100]
#  [1696  500  119]
#  [1256  468  106]
#  [1434  642  119]]

所以现在,循环在这个数组中的每个coordinate上进行迭代,即每个子数组y ,它采用第三个元素(索引为 2 的那个)。

在循环的第二个版本中,您开始遍历x的元素,但x只有一个元素,即数组 ( y , z ),然后您获取第三个元素,即第三行[ 994, 132, 108 ] .

如果您在哪里简化原始数组以消除外部维度,这似乎是不必要的:

circles = circles[0,:]

print(circles.shape)
print(circles)

# Prints
# (8, 3)
# [[1358  254  113]
#  [1630  282   89]
#  [ 994  132  108]
#  [1204  742  103]
#  [ 976  638  100]
#  [1696  500  119]
#  [1256  468  106]
#  [1434  642  119]]

您现在可以毫无问题地使用第二个 function

def get_radius(circles):
    radii=[]
    for coordinates in circles:
        radii.append(coordinates[2])
    return radii

print(get_radius(circles))

# Prints
# [113, 89, 108, 103, 100, 119, 106, 119]

因为现在循环遍历circles的简化版本(每一行y )中的每个第一级元素并获取第三个元素。

Numpy arrays 可能会造成混淆,这是一个从检查shape开始调试的好习惯。

除了IgnatiusReilly提供的解释之外,您还可以执行矢量化数组以获得相同的所需答案。

circles[0,:,2]
array([113,  89, 108, 103, 100, 119, 106, 119])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM